Подтвердить что ты не робот

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?

благодарит Лесли

4b9b3361

Ответ 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);