import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
+import android.media.ExifInterface;
import android.media.ThumbnailUtils;
import android.os.AsyncTask;
import android.util.TypedValue;
if (bitmap != null) {
thumbnail = ThumbnailUtils.extractThumbnail(bitmap, px, px);
+
+ // Rotate image, obeying exif tag
+ thumbnail = rotateImage(thumbnail, mFile.getStoragePath());
// Add thumbnail to cache
addBitmapToCache(imageKey, thumbnail);
mThumbnailsDiskCacheLock.notifyAll(); // Wake any waiting threads
}
}
+
+ /**
+ * Rotate bitmap according to EXIF orientation.
+ * Cf. http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/
+ * @param bitmap Bitmap to be rotated
+ * @param storagePath Path to source file of bitmap. Needed for EXIF information.
+ * @return correctly EXIF-rotated bitmap
+ */
+ public static 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;
+ }
}
import com.actionbarsherlock.view.MenuItem;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+import com.owncloud.android.datamodel.ThumbnailsCacheManager.ThumbnailGenerationTask;
import com.owncloud.android.files.FileMenuFilter;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
}
- result = rotateImage(result, storagePath);
+ // Rotate image, obeying exif tag
+ result = ThumbnailsCacheManager.rotateImage(result, storagePath);
return result;
}
- /**
- * Rotate bitmap according to EXIF orientation.
- * Cf. http://www.daveperrett.com/articles/2012/07/28/exif-orientation-handling-is-a-ghetto/
- * @param bitmap Bitmap to be rotated
- * @param storagePath Path to source file of bitmap. Needed for EXIF information.
- * @return correctly EXIF-rotated bitmap
- */
- 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();