Android получить ориентацию камеры Bitmap? И поверните назад -90 градусов
У меня есть этот код:
//choosed a picture
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
if (requestCode == ImageHelper.SELECT_PICTURE) {
String picture = "";
Uri selectedImageUri = data.getData();
//OI FILE Manager
String filemanagerstring = selectedImageUri.getPath();
//MEDIA GALLERY
String selectedImagePath = ImageHelper.getPath(mycontext, selectedImageUri);
picture=(selectedImagePath!=null)?selectedImagePath:filemanagerstring;
...
Это только выбор изображения, из галереи. это хорошо, но когда я открываю эту картинку на изображении, изображения, когда они принимали "РЕЖИМ ПОРТРЕТА", выглядели хорошо, но изображения, которые снимали "ЛАНДШАФТНЫЙ РЕЖИМ" с камерой, открываясь в -90 градусов.
Как я могу повернуть эти фотографии назад?
Bitmap output = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Я пробовал это:
Log.e("w h", bitmap.getWidth()+" "+bitmap.getHeight());
if (bitmap.getWidth()<bitmap.getHeight()) canvas.rotate(-90);
но это не работает, все размеры изображения: * 2560 1920 пикселей (режим PORTRAIT и LANDSCAPE)
Что я могу сделать, чтобы повернуть фотографии LANDSCAPE?
благодарит Лесли
Ответы
Ответ 1
Если фотография сделана с помощью цифровой камеры или смартфона, вращение часто сохраняется на фотографиях Exif в качестве части файла изображения. Вы можете прочитать метафайлы Exif с помощью Android ExifInterface
.
Сначала создайте ExifInterface
:
ExifInterface exif = new ExifInterface(uri.getPath());
Затем найдите текущее вращение:
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Преобразование exif в градусы:
int rotationInDegrees = exifToDegrees(rotation);
где
private static int exifToDegrees(int exifOrientation) {
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; }
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; }
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; }
return 0;
}
Затем с помощью фактического поворот изображения в качестве опорной точки, чтобы повернуть изображение, используя Matrix
.
Matrix matrix = new Matrix();
if (rotation != 0f) {matrix.preRotate(rotationInDegrees);}
Вы создаете новое повернутое изображение с помощью метода Bitmap.createBitmap
, который принимает Matrix
в качестве параметра:
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
где Matrix m
содержит новое вращение:
Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);
Смотрите эти руководства для полезных примеров исходного кода:
Ответ 2
Последний ответ был технически совершенным, но я старался создать систему для управления изображениями, поворота, изменения размера, кеширования и загрузки в ImageViews, и я могу сказать, что это ад. Даже когда все это было сделано, сбои иногда вызывают OutOfMemory на некоторых устройствах.
Моя задача - не изобретать колесо, он имеет идеальный дизайн. Google сам рекомендует вам использовать Glide. Он работает в одной строке, супер прост в использовании, имеет легкий размер и количество функций, он управляет EXIF по умолчанию, и он использует память как шарм. Это просто закодированная черная магия;)
Я не уверен, что Picasso также управляет EXIF, но есть быстрый ввод для обоих из них:
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
Мой совет: не тратьте время и не используйте их. Вы можете решить свою проблему в одной строке:
Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);