Merge "Fix thumbnail's orienation issue" into qt-dev

This commit is contained in:
Ivan Chiang
2019-05-22 02:10:52 +00:00
committed by Android (Google) Code Review
2 changed files with 21 additions and 39 deletions

View File

@@ -36,7 +36,6 @@ import android.graphics.Bitmap;
import android.graphics.ImageDecoder;
import android.graphics.Point;
import android.media.ExifInterface;
import android.media.MediaFile;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
@@ -1681,46 +1680,35 @@ public final class DocumentsContract {
public static AssetFileDescriptor openImageThumbnail(File file) throws FileNotFoundException {
final ParcelFileDescriptor pfd = ParcelFileDescriptor.open(
file, ParcelFileDescriptor.MODE_READ_ONLY);
Bundle extras = null;
try {
final ExifInterface exif = new ExifInterface(file.getAbsolutePath());
switch (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1)) {
case ExifInterface.ORIENTATION_ROTATE_90:
extras = new Bundle(1);
extras.putInt(EXTRA_ORIENTATION, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
extras = new Bundle(1);
extras.putInt(EXTRA_ORIENTATION, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
extras = new Bundle(1);
extras.putInt(EXTRA_ORIENTATION, 270);
break;
}
final long[] thumb = exif.getThumbnailRange();
if (thumb != null) {
// If we use thumb to decode, we need to handle the rotation by ourselves.
Bundle extras = null;
switch (exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1)) {
case ExifInterface.ORIENTATION_ROTATE_90:
extras = new Bundle(1);
extras.putInt(EXTRA_ORIENTATION, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
extras = new Bundle(1);
extras.putInt(EXTRA_ORIENTATION, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
extras = new Bundle(1);
extras.putInt(EXTRA_ORIENTATION, 270);
break;
}
return new AssetFileDescriptor(pfd, thumb[0], thumb[1], extras);
}
} catch (IOException e) {
}
// Use ImageDecoder to do full image decode of heif format file
// will have right orientation. So, we don't need to add orientation
// information into extras.
final String mimeType = MediaFile.getMimeTypeForFile(file.getName());
if (mimeType.equals("image/heif")
|| mimeType.equals("image/heif-sequence")
|| mimeType.equals("image/heic")
|| mimeType.equals("image/heic-sequence")) {
return new AssetFileDescriptor(pfd, 0 /* startOffset */,
AssetFileDescriptor.UNKNOWN_LENGTH, null /* extras */);
}
return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH, extras);
// Do full file decoding, we don't need to handle the orientation
return new AssetFileDescriptor(pfd, 0, AssetFileDescriptor.UNKNOWN_LENGTH, null);
}
private static void rethrowIfNecessary(Exception e) throws FileNotFoundException {

View File

@@ -265,13 +265,10 @@ public class ThumbnailUtils {
}
}
boolean isHeifFile = false;
if (mimeType.equals("image/heif")
|| mimeType.equals("image/heif-sequence")
|| mimeType.equals("image/heic")
|| mimeType.equals("image/heic-sequence")) {
isHeifFile = true;
try (MediaMetadataRetriever retriever = new MediaMetadataRetriever()) {
retriever.setDataSource(file.getAbsolutePath());
bitmap = retriever.getThumbnailImageAtIndex(-1,
@@ -298,11 +295,8 @@ public class ThumbnailUtils {
if (bitmap == null) {
bitmap = ImageDecoder.decodeBitmap(ImageDecoder.createSource(file), resizer);
// Use ImageDecoder to do full image decode of heif format file
// will have right orientation. Don't rotate the bitmap again.
if (isHeifFile) {
return bitmap;
}
// Use ImageDecoder to do full file decoding, we don't need to handle the orientation
return bitmap;
}
// Transform the bitmap if the orientation of the image is not 0.