瀏覽代碼

- obey exif orientation tag

tobiasKaminsky 10 年之前
父節點
當前提交
c779c7c6ed
共有 1 個文件被更改,包括 66 次插入0 次删除
  1. 66 0
      src/com/owncloud/android/ui/preview/PreviewImageFragment.java

+ 66 - 0
src/com/owncloud/android/ui/preview/PreviewImageFragment.java

@@ -30,7 +30,9 @@ import android.app.Activity;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.BitmapFactory.Options;
+import android.graphics.Matrix;
 import android.graphics.Point;
+import android.media.ExifInterface;
 import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.v4.app.FragmentStatePagerAdapter;
@@ -412,9 +414,73 @@ public class PreviewImageFragment extends FileFragment {
                 Log_OC.e(TAG, "Unexpected error loading " + getFile().getStoragePath(), t);
                 
             }
+            
+            result = rotateImage(result, storagePath);
+           
+            
             return result;
         }
         
+        private Bitmap rotateImage(Bitmap bitmap, String storagePath){
+            Bitmap resultBitmap = bitmap;
+
+            try
+            {
+                ExifInterface exifInterface = new ExifInterface(storagePath);
+                int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
+
+                Matrix matrix = new Matrix();
+
+                // 1: nothing to do
+                
+                // 2
+                if (orientation == ExifInterface.ORIENTATION_FLIP_HORIZONTAL)
+                {
+                    matrix.postScale(-1.0f, 1.0f);
+                }
+                // 3
+                else if (orientation == ExifInterface.ORIENTATION_ROTATE_180)
+                {
+                    matrix.postRotate(180);
+                }
+                // 4
+                else if (orientation == ExifInterface.ORIENTATION_FLIP_VERTICAL)
+                {
+                    matrix.postScale(1.0f, -1.0f);
+                }
+                // 5
+                else if (orientation == ExifInterface.ORIENTATION_TRANSPOSE)
+                {
+                    matrix.postRotate(-90);
+                    matrix.postScale(1.0f, -1.0f);
+                }
+                // 6
+                else if (orientation == ExifInterface.ORIENTATION_ROTATE_90)
+                {
+                    matrix.postRotate(90);
+                }
+                // 7
+                else if (orientation == ExifInterface.ORIENTATION_TRANSVERSE)
+                {
+                    matrix.postRotate(90);
+                    matrix.postScale(1.0f, -1.0f);
+                }
+                // 8
+                else if (orientation == ExifInterface.ORIENTATION_ROTATE_270)
+                {
+                    matrix.postRotate(270);
+                } 
+                
+                // Rotate the bitmap
+                resultBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
+            }
+            catch (Exception exception)
+            {
+                Log_OC.e(TAG, "Could not rotate the image: " + storagePath);
+            }
+            return resultBitmap;
+        }
+        
         @Override
         protected void onPostExecute(Bitmap result) {
             hideProgressWheel();