From 96fe7192d17518b4e27a8b223a3bda1e2145bddf Mon Sep 17 00:00:00 2001 From: Remi Rampin Date: Tue, 5 Jul 2016 20:23:26 -0400 Subject: [PATCH] Proper fix using ExifInterface --- app/src/main/AndroidManifest.xml | 2 +- .../main/java/fr/remram/taquindroid/Game.java | 47 +----- .../fr/remram/taquindroid/ImageTools.java | 140 ++++++++++++++++++ .../java/fr/remram/taquindroid/Options.java | 9 +- 4 files changed, 150 insertions(+), 48 deletions(-) create mode 100644 app/src/main/java/fr/remram/taquindroid/ImageTools.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e6b5b2d..9df06a3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ package="fr.remram.taquindroid" android:versionCode="1002000" android:versionName="1.2"> - + 0) - { - Matrix matrix = new Matrix(); - matrix.postRotate(orientation); - image = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true); - } - } - } catch(IOException e) { - Log.e("TAQUINDROID", "Couldn't open requested image file", e); - } - } + image = ImageTools.getBitmap(this, m_SelectedImage); if(image == null) image = BitmapFactory.decodeResource(getResources(), R.drawable.image); @@ -95,21 +67,4 @@ public void onGameEnded(int moves) finish(); } - // From http://stackoverflow.com/a/8661569/711380 - public int getOrientation(Uri photoUri) - { - Cursor cursor = getContentResolver().query(photoUri, - new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); - - int result = -1; - if (cursor != null) { - if (cursor.moveToFirst()) { - result = cursor.getInt(0); - } - cursor.close(); - } - - return result; - } - } diff --git a/app/src/main/java/fr/remram/taquindroid/ImageTools.java b/app/src/main/java/fr/remram/taquindroid/ImageTools.java new file mode 100644 index 0000000..3e708e0 --- /dev/null +++ b/app/src/main/java/fr/remram/taquindroid/ImageTools.java @@ -0,0 +1,140 @@ +package fr.remram.taquindroid; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Matrix; +import android.media.ExifInterface; +import android.net.Uri; +import android.os.ParcelFileDescriptor; +import android.util.Log; + +import java.io.File; +import java.io.FileDescriptor; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +public class ImageTools { + + public static String getExtension(String path) + { + int index = path.lastIndexOf("."); + if(index > 0 && index < path.length() - 1 && index >= path.length() - 5) + return path.substring(index).toLowerCase(); + else + return ""; + } + + public static int getOrientation(Context context, Uri photoUri) + { + try { + InputStream istream = context.getContentResolver().openInputStream(photoUri); + if(istream == null) + return ExifInterface.ORIENTATION_UNDEFINED; + + File outputDir = context.getCacheDir(); + String extension = getExtension(photoUri.getPath()); + File tempfile = File.createTempFile("taquindroid", extension, outputDir); + FileOutputStream ostream = new FileOutputStream(tempfile); + + byte[] buffer = new byte[4096]; + int len; + while((len = istream.read(buffer)) != -1) + ostream.write(buffer, 0, len); + ostream.close(); + istream.close(); + + ExifInterface exif = new ExifInterface(tempfile.getAbsolutePath()); + int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_UNDEFINED); + if(!tempfile.delete()) + Log.e("TAQUINDROID", String.format("Couldn't delete teporary file %s", tempfile.getAbsolutePath())); + return orientation; + } catch(IOException e) { + Log.e("TAQUINDROID", "Error reading image orientation"); + return ExifInterface.ORIENTATION_UNDEFINED; + } + } + + public static Matrix getImageMatrix(int orientation) + { + Matrix matrix = new Matrix(); + switch(orientation) + { + case ExifInterface.ORIENTATION_NORMAL: + return null; + case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: + matrix.setScale(-1, 1); + break; + case ExifInterface.ORIENTATION_ROTATE_180: + matrix.setRotate(180); + break; + case ExifInterface.ORIENTATION_FLIP_VERTICAL: + matrix.setRotate(180); + matrix.postScale(-1, 1); + break; + case ExifInterface.ORIENTATION_TRANSPOSE: + matrix.setRotate(90); + matrix.postScale(-1, 1); + break; + case ExifInterface.ORIENTATION_ROTATE_90: + matrix.setRotate(90); + break; + case ExifInterface.ORIENTATION_TRANSVERSE: + matrix.setRotate(-90); + matrix.postScale(-1, 1); + break; + case ExifInterface.ORIENTATION_ROTATE_270: + matrix.setRotate(-90); + break; + default: + return null; + } + return matrix; + } + + public static Matrix getImageMatrix(Context context, Uri photoUri) + { + return getImageMatrix(getOrientation(context, photoUri)); + } + + public static Bitmap orientBitmap(Bitmap image, int orientation) + { + Matrix matrix = getImageMatrix(orientation); + if(matrix == null) + return image; + try { + Bitmap image2 = Bitmap.createBitmap(image, 0, 0, image.getWidth(), image.getHeight(), matrix, true); + image.recycle(); + return image2; + } + catch(OutOfMemoryError e) { + e.printStackTrace(); + return null; + } + } + + public static Bitmap getBitmap(Context context, Uri uri) + { + try { + ParcelFileDescriptor descriptor = context.getContentResolver().openFileDescriptor(uri, "r"); + if(descriptor != null) + { + FileDescriptor fileDescriptor = descriptor.getFileDescriptor(); + Bitmap image = BitmapFactory.decodeFileDescriptor(fileDescriptor); + descriptor.close(); + + int orientation = ImageTools.getOrientation(context, uri); + image = ImageTools.orientBitmap(image, orientation); + + return image; + } + else + return null; + } catch(IOException e) { + return null; + } + } + +} diff --git a/app/src/main/java/fr/remram/taquindroid/Options.java b/app/src/main/java/fr/remram/taquindroid/Options.java index d7657fb..bfa743e 100644 --- a/app/src/main/java/fr/remram/taquindroid/Options.java +++ b/app/src/main/java/fr/remram/taquindroid/Options.java @@ -4,6 +4,7 @@ import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; +import android.graphics.Matrix; import android.net.Uri; import android.os.Bundle; import android.view.View; @@ -128,7 +129,13 @@ protected void updateImage() { ImageView image = (ImageView) findViewById(R.id.preview_image); if(m_SelectedImage != null) - image.setImageURI(m_SelectedImage); + { + Matrix matrix = ImageTools.getImageMatrix(this, m_SelectedImage); + if(matrix == null) + image.setImageURI(m_SelectedImage); + else + image.setImageBitmap(ImageTools.getBitmap(this, m_SelectedImage)); + } else image.setImageDrawable(getResources().getDrawable(R.drawable.image)); }