如何在xamarin表单中实现Exif.PCL?

时间:2016-05-27 05:52:01

标签: xamarin.forms exif

我正在尝试创建一个项目,其中从移动摄像头上传照片,但是当它与前置摄像头一起拍摄时,它会颠倒旋转(尤其是Android)。我已经阅读过使用Exif.PCL nuget包的建议,但不知道如何实现相同的。有人可以帮我解决这个问题吗? 感谢

1 个答案:

答案 0 :(得分:2)

<强>背景

我在其中一个应用中遇到了同样的问题。在尝试不同的方法后,我发现了当前实现的几个问题。通常我使用XLabs,它具有媒体选择功能。

<强>问题

首先,它缺乏对图像缩放和自动旋转后的支持。那是你的问题。因此,首先,我必须在选择图像后立即执行一些后处理。

其次,Android和Xamarin.Forms存在问题,因为在Android中如何处理活动。它在Android上的工作方式是启动CameraActivity或PhotoGalleryActivity,它们实际上托管在不同的应用程序中。这些活动使用了大量的系统内存,并且由于这个操作系统将尝试杀死非forground进程,包括你的应用程序:) Workarround为此完全实现了我的应用程序中的照片获取流程,从头开始创建照片拍摄活动。因此,我永远不会离开我的应用程序,Android运行时永远不会杀死我的应用程序。

<强>解决方案

考虑到所有这些,我实现了自己的图像捕获流程。您可以找到源代码HERE。基本架构如下: 我创建了IImageService,其中包含从相机或库中拾取图像的方法。

public interface IImageService
    {
        Task<IImage> GetImageFromLibrary();
        Task<IImage> GetImageFromCamera();
    }

然后我分别为iOS和Android实现了这个并使用了依赖注入。对于iOS,我使用XLabs实现,因为它应该没有问题。对于Android,我创建了几个活动来支持从相机和库中挑选图片:CameraActivityPhotoGaleryActivity,它基本上取代了原生图像拾取活动。

在我选择图像后,我会进行缩放和旋转程序。对于iOS,我创建了UIImageToolbox静态类,其中包含GetScaledAndRotatedImage方法。对于Android,它是具有BitmapToolbox方法的GetScaledAndRotatedBitmap静态类。

在我的示例应用程序中,我创建了ImageViewModelImagePage来演示IImageService的用法。它应该是直截了当的。

如何使用示例应用

让我说一点。您只能对iOS和Android使用XLabs实现,只需使用BitmapToolboxUIImageToolbox来实现缩放和旋转。这是你的问题的答案。但是,如果您希望自己的应用在Android上保持稳定,则需要稍微踩一下。

  1. 将所有必需的nuget包安装到您的Forms,Droid和iOS项目中。您可以在每个项目的packages.config文件中找到示例应用程序使用的包
  2. 我使用MvvmCross Messenger插件进行广播消息传递,如果您有替代方案,则可以轻松替换它。但如果您想使用它,请不要忘记在AppDelegateMainActivity

    中注册依赖项

    DependencyService.Register();

  3. 从示例应用程序向您的Forms,iOS和Android项目添加必要的类。您可以使用Resharper为您修复名称空间。

  4. 对于xaml文件,如果您使用药物并删除到表单项目,则默认构建操作和自定义工具将设置为错误的值。因此,单击xaml文件,选择属性设置将操作设置为嵌入式资源,将自定义工具设置为 MSBuild:UpdateDesignTimeXaml

  5. 对于Android项目,从drawabledrawable-xxhdpilayoutvalues个文件夹中添加必要的资源。

  6. 在grid_cell_photo_galery_item.axml文件中修复命名空间。将ImageSample.Droid.Views.SquareRelativeLayout替换为您的命名空间。

  7. 对于Android,右键单击Android项目,选择属性,转到Android Manifest并添加CAMERA,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。

  8. 对于Android,右键单击Android项目,选择属性,转到高级并将最大堆大小设置为1G,这是必需的,因为PhotoGalaryActivity使用大量内存来显示图像,我们需要增加堆大小

  9. 对于iOS,请不要忘记在MediaPicker - AppDelegate

  10. 中为DependencyService.Register<MediaPicker>();添加依赖注入

    就是这样。