【发布时间】:2017-10-26 04:29:29
【问题描述】:
我在 Xamarin.Forms 项目的 SkiaSharp 中使用 SKBitmap.Resize() 方法来调整图像大小以进行显示。我遇到的问题是在iOS上拍照时,当照片是纵向拍摄时,图像以右侧朝上显示。在 Android 上拍照,从 Android 和 iOS 设备上的照片库导入会保持方向,但在 iOS 中拍照则不会。如果我不使用 SkiaSharp 调整图像大小(仅显示图像而不调整大小),则图像以正确的方向显示。然而,这不是一个解决方案,因为图像需要调整大小。下面是我的代码 -
private byte[] GetResizedImageData(string imageName)
{
float resizeFactor = 0.5f;
var filePath = PathUtil.GetImagePath(imageName);
var ogBitmap = SKBitmap.Decode(filePath);
float fWidth = ogBitmap.Width * resizeFactor;
int width = (int) Math.Round(fWidth);
float fHeight = ogBitmap.Height * resizeFactor;
int height = (int) Math.Round(fHeight);
if (height >= 4096 || width >= 4096)
{
width = width * (int)resizeFactor;
height = height * (int)resizeFactor;
}
var scaledBitmap = ogBitmap.Resize(new SKImageInfo( width, height), SKBitmapResizeMethod.Box);
var image = SKImage.FromBitmap(scaledBitmap);
var data = image.Encode(SKEncodedImageFormat.Jpeg, 100);
return data.ToArray();
}
PathUtil.GetImagePath() 只是获取照片存储位置的特定于平台的路径的助手。
【问题讨论】:
-
您应该始终阅读图像上的本机方向 (EXIF),因为 iPhone 的肖像通常被标记为
UIImageOrientation.Right,在 Android 上,事情变得非常混乱,因为不同的制造商有时会将他们的相机传感器安装为顺时针 90 度或逆时针(三星和 LG 以 90 度旋转而臭名昭著,我什至使用了几个中国的 Android 设备,传感器安装了 180 度,大多数情况下这是由于物理制造和包装限制,故事的寓意,阅读图像在应用任何转换之前旋转... ;-) -
您可以通过
SKCodec.Origin获取Exif 方向,并从SKCodecOrigin确定您需要应用的适当转换。 -
所以在抓住它之后,我似乎无法更改 SKCodec.Origin,因为它是只读的,我将图像作为字节数组输出到 Xamarin.Forms Image.ImageSource 我可以' t 似乎也可以处理旋转/转换。我想我必须添加特定于平台的代码来处理位图方向的变化。
标签: image image-processing xamarin xamarin.forms skiasharp