2013-06-12 76 views
2

我正在加載兩個位圖,一個位於jpg,另一個位於png格式。圖像完全相同,保存的分辨率相同:3461x2480。在jpg和png中加載相同的圖像會產生不同的位圖大小

當我在InSampleSize中使用具有相同比例的BitmapFactory.decodeFile()加載圖像時,我獲得了不同大小的內存位圖,jpg略大於png。我在一個圖庫中顯示兩者,其差異是顯而易見的。我已經在LogCat中打印了位圖大小,並驗證了它們在加載後具有不同的大小。 這兩個圖像都在外部存儲器和相同的目錄中。

任何人都知道爲什麼他們的大小一旦加載不同?我如何控制它?

我正在使用的代碼是:

public static Bitmap loadImageScaled(String fileName, int width, int height){ 

    // Get the dimensions of the bitmap 
    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inJustDecodeBounds = true; 

    BitmapFactory.decodeFile(fileName, bmOptions); 

    int photoW = bmOptions.outWidth; 
    int photoH = bmOptions.outHeight; 

    Log.d(TAG, "Image w= " + photoW + " h=" + photoH + " " + fileName); 
    Log.d(TAG, "In w= " + width + " h=" + height); 

    // Determine how much to scale down the image 
    int scaleFactor = Math.min(photoW/width, photoH/height); 
    Log.d(TAG, "scaleFactor = " + scaleFactor); 

    // Decode the image file into a Bitmap 
    bmOptions.inJustDecodeBounds = false; 
    bmOptions.inSampleSize = scaleFactor; 
    bmOptions.inPurgeable = true; 

    Bitmap bitmap = BitmapFactory.decodeFile(fileName, bmOptions); 

    Log.d(TAG, "Out w= " + bitmap.getWidth() + " h=" + bitmap.getHeight()); 

    return bitmap; 
} 

在logcat中我得到這個消息:

Image w= 3461 h=2480 Img09.jpg 
In w= 173 h=124 
scaleFactor = 20 
Out w= 216 h=155 

Image w= 3461 h=2480 Img10.png 
In w= 173 h=124 
scaleFactor = 20 
Out w= 173 h=124 

任何想法?

+0

是文件名是否正確? Img09和Img10?我期待兩個Img10文件僅在其擴展中有所不同... – Piovezan

+0

是的,它們是正確的。我假定文件名不是問題。 – Toni

+0

哦,當然我編輯logcat結果以擺脫噪音(時間戳等),只留下相關的字符串。 – Toni

回答

3

是的,沒關係我猜:)如果你看文檔(http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSize)有關於它如何工作的說明。

如果你計算數字可以看到216分之3461= 16和173分之3461= 20。這意味着,PNG是使用所需的樣本大小,但JPG被四捨五入到最接近的功率的2

+0

那麼,在文檔中很明顯,只有2的冪被使用:「注意:解碼器使用基於2的冪的最終值,任何其他值將向下舍入到2的最近冪」。在這兩種情況下,我都發送scale = 20,所以解碼器在兩次調用中都應該使用16。 – Toni

+0

我試圖在兩次調用中強制使用2的冪,然後得到相同的位圖大小,所以您的解釋是正確的。解決方案似乎是在InSampleSize中始終使用2的冪來避免奇怪的行爲。 – Toni

+0

也許是因爲jpeg僅支持硬件解碼。我不知道那麼多:) – zoki

相關問題