我正在尝试创建一个项目,其中从移动摄像头上传照片,但是当它与前置摄像头一起拍摄时,它会颠倒旋转(尤其是Android)。我已经阅读过使用Exif.PCL nuget包的建议,但不知道如何实现相同的。有人可以帮我解决这个问题吗? 感谢
答案 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,我创建了几个活动来支持从相机和库中挑选图片:CameraActivity
,PhotoGaleryActivity
,它基本上取代了原生图像拾取活动。
在我选择图像后,我会进行缩放和旋转程序。对于iOS,我创建了UIImageToolbox
静态类,其中包含GetScaledAndRotatedImage
方法。对于Android,它是具有BitmapToolbox
方法的GetScaledAndRotatedBitmap
静态类。
在我的示例应用程序中,我创建了ImageViewModel
和ImagePage
来演示IImageService
的用法。它应该是直截了当的。
如何使用示例应用
让我说一点。您只能对iOS和Android使用XLabs实现,只需使用BitmapToolbox
和UIImageToolbox
来实现缩放和旋转。这是你的问题的答案。但是,如果您希望自己的应用在Android上保持稳定,则需要稍微踩一下。
packages.config
文件中找到示例应用程序使用的包我使用MvvmCross Messenger插件进行广播消息传递,如果您有替代方案,则可以轻松替换它。但如果您想使用它,请不要忘记在AppDelegate
和MainActivity
DependencyService.Register();
从示例应用程序向您的Forms,iOS和Android项目添加必要的类。您可以使用Resharper为您修复名称空间。
对于xaml文件,如果您使用药物并删除到表单项目,则默认构建操作和自定义工具将设置为错误的值。因此,单击xaml文件,选择属性设置将操作设置为嵌入式资源,将自定义工具设置为 MSBuild:UpdateDesignTimeXaml
对于Android项目,从drawable
,drawable-xxhdpi
,layout
和values
个文件夹中添加必要的资源。
在grid_cell_photo_galery_item.axml文件中修复命名空间。将ImageSample.Droid.Views.SquareRelativeLayout
替换为您的命名空间。
对于Android,右键单击Android项目,选择属性,转到Android Manifest并添加CAMERA,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限。
对于Android,右键单击Android项目,选择属性,转到高级并将最大堆大小设置为1G,这是必需的,因为PhotoGalaryActivity使用大量内存来显示图像,我们需要增加堆大小
对于iOS,请不要忘记在MediaPicker
- AppDelegate
DependencyService.Register<MediaPicker>();
添加依赖注入
醇>
就是这样。