Эффективно вращать изображения в Android.Xamarin - PullRequest
0 голосов
/ 09 мая 2019

В моем приложении Xamarin.Android У меня та же проблема, что и в этом вопросе: Почему изображение, снятое с помощью камеры, поворачивается на некоторых устройствах на 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?
  • или еще лучший подход: есть ли простой способ повернуть файл изображения в моем хранилище, не загружая его в растровые изображения?

EDIT

  • или есть способ сообщить камере о намерении НЕ поворачивать изображение, чтобы изображение никогда не поворачивалось
...