在Android.Xamarin中有效旋转图像

时间:2019-05-09 10:07:10

标签: android xamarin.android exif image-rotation android-image-capture

在我的 Xamarin.Android应用中,我遇到了与该问题相同的问题: Why does an image captured using camera intent gets rotated on some devices on Android?

我能够检测到捕获的图像是否旋转,并且可以将图像旋转到正确的方向:

ExifInterface ei = new ExifInterface(Storage.Instance.ExternalTmpImagePath);
Android.Media.Orientation ori = (Android.Media.Orientation)ei.GetAttributeInt(ExifInterface.TagOrientation, (int)Android.Media.Orientation.Normal);

float angle = 0;
switch (ori)
{
    case Android.Media.Orientation.Rotate180:
        angle = 180;
        break;
    case Android.Media.Orientation.Rotate270:
        angle = 270;
        break;
    case Android.Media.Orientation.Rotate90:
        angle = 90;
        break;
    default:
        break;
}

if (angle != 0)
{
    BitmapFactory.Options rotateOptions = await GetBitmapOptionsOfImageAsync(Storage.Instance.ExternalTmpImagePath);
    using (Bitmap bitmapToRotate = await LoadScaleDownBitmapForDisplayAsync(Storage.Instance.ExternalTmpImagePath, rotateOptions, 1024, 1024))
    {

        Matrix matrix = new Matrix();
        matrix.PostRotate(angle);

        using (Bitmap newBitmap = Bitmap.CreateBitmap(bitmapToRotate, 0, 0, bitmapToRotate.Width, bitmapToRotate.Height, matrix, true))
        {
            Toast.MakeText(Context, "Bild wird rotiert.", ToastLength.Long).Show();
            Storage.Instance.Delete(Storage.Instance.ExternalTmpImagePath);
            var stream = new FileStream(Storage.Instance.ExternalTmpImagePath, FileMode.Create);
            newBitmap.Compress(Bitmap.CompressFormat.Png, 10, stream);
            stream.Close();
        }
    }
}

正如您在我的代码中看到的那样,带标题的图像存储在Storage.Instance.ExternalTmpImagePath中。

我发现旋转图像的所有解决方案都使用相同的步骤:

  1. 从图像路径创建位图
  2. 使用矩阵旋转该位图
  3. 将旋转后的位图保存到存储中(或对图像进行任何处理)

我的问题是,此过程最多需要5秒钟来旋转图像。确切地说,newBitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);需要很多时间。

所以我的问题是:

  • 是否可以在此过程中节省时间,而又不会造成任何质量损失并保留CompressFormat.Png
  • 或更好的方法:是否有一种简单的方法可以旋转存储中的图像文件而不将其加载到位图中?

编辑

  • 或者有一种方法可以告诉相机不要旋转图像,从而使图像永不旋转

0 个答案:

没有答案