В моем приложении 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
.
Все решения, которые я нашел для поворота изображения, используют одну и ту же процедуру:
- Создание растрового изображения из пути к изображению
- повернуть это растровое изображение, используя матрицу
- сохранить повернутое растровое изображение в хранилище (или сделать с изображением все, что вы хотите)
Моя проблема в том, что эта процедура занимает до 5 секунд, чтобы повернуть изображение. Чтобы быть точным, newBitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
занимает много времени.
Итак, мой вопрос:
- Есть ли способ сэкономить время в этой процедуре без потери качества и сохранения
CompressFormat.Png
?
- или еще лучший подход: есть ли простой способ повернуть файл изображения в моем хранилище, не загружая его в растровые изображения?
EDIT
- или есть способ сообщить камере о намерении НЕ поворачивать изображение, чтобы изображение никогда не поворачивалось