当我用下面的代码捕捉照片时,我会在Android和iOS中将保存的照片旋转90度
有没有解决这个问题的办法?所以我得到保存的图像方向调整正确
FileResult photo = await MediaPicker.CapturePhotoAsync();
using Stream sourceStream = await photo.OpenReadAsync();
var picture = PlatformImage.FromStream(sourceStream);
string localFilePath = $"{FileSystem.CacheDirectory}/{photo.FileName}";
using FileStream localFileStream = File.OpenWrite(localFilePath);
await picture.SaveAsync(localFileStream, ImageFormat.Jpeg, quality: 0.90f);
字符串
2条答案
按热度按时间dffbzjpn1#
保存源流的字节直接保存到文件流。
不要使用中间图片。
e5nszbig2#
我处理这个问题的方法是在iOS和Android上实现我自己的
CapturePhotoAsync
,这样图像总是以正确的方式返回(使用这个线程上的一些代码:https://github.com/xamarin/Essentials/issues/1514)。然后我可以很高兴地使用PlatformImage.FromStream
,因为我知道当我丢失exif数据时,图像已经是正确的方式了。一旦他们解决了这个问题,它也应该最大限度地减少更改。我创建了以下接口:
字符串
然后在我创建的
Platforms/Android
目录下:型
在我创建的
Platforms/iOS
目录下(注意,这两个都是分部类,必须在同一个命名空间中):型
然后在
MauiProgram.cs
文件中添加以下内容:型
然后,您可以注入
IImageService
并使用它来拾取图像。每个实现都克服了MAUI提供的
MediaPicker.Default.CapturePhotoAsync
的本机实现的特定问题:*iOS。MAUI实现返回一个已剥离exif数据且未校正图像的PNG。上述实现创建自己的
UIImagePickerController
示例并检索图像,校正图像,将其保存为jpeg,然后返回指向该JPEG的FileResult
。*Android. MAUI实现返回一个包含exif数据的JPEG,但是当调用
PlatformImage.FromStream
时,它会丢失该数据,因此为了消除这种影响,上面的实现 Package 了对MediaPicker.Default.CapturePhotoAsync
的调用,然后使用exif数据创建一个新的文件更正版本。