解決Android通過BitmapFactory獲取圖片寬高度相反的問題

程式碼超人發表於2018-02-26

前言

常見通過BitmapFactory獲取圖片的寬高度的程式碼如下:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile("{IMAGE_PATH}", options);
int width = options.outWidth;
int height = options.outHeight;
複製程式碼

使用上述程式碼,在圖片未旋轉的情況下得到的結果是正確的。但是如果圖片需要旋轉90度或者270度才能正確顯示時,上述程式碼獲取的寬度則是相反的(及獲取到的寬度實際上為圖片的高度,高度亦然)。

所以,我們需要通過判斷圖片顯示需要旋轉的度數來確定圖片真實的寬高。

在Android中可以通過ExifInterface來獲取圖片的旋轉方向。具體程式碼如下:

try
{  
    ExifInterface exifInterface = new ExifInterface({IMAGE_PATH});  
    int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); return orientation;
}
catch (IOException e)
{
    e.printStackTrace();  
    return ExifInterface.ORIENTATION_NORMAL;
}
複製程式碼

獲取到方向之後,就可以通過方向的值來獲取正確的圖片寬高。完整程式碼如下:

public static Size getImageSize(String imageLocalPath)
{
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    Bitmap bitmap = BitmapFactory.decodeFile("{IMAGE_PATH}", options);
    int width = options.outWidth;
    int height = options.outHeight;
    
    int orientation = getImageOrientation(imageLocalPath);
    switch(orientation)
    {
        case ExifInterface.ORIENTATION_ROTATE_90:
        case ExifInterface.ORIENTATION_ROTATE_270:
        {
            return new Size(height, width);
        }
        default:
        {
            return new Size(width, height);
        }
    }
}

public static int getImageOrientation(String imageLocalPath)
{
    try
    {  
        ExifInterface exifInterface = new ExifInterface({IMAGE_PATH});  
        int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); return orientation;
`   }
    catch (IOException e)
    {
        e.printStackTrace();  
        return ExifInterface.ORIENTATION_NORMAL;
    }
}
複製程式碼

相關文章