Android Bitmap 知識點梳理

Android Bitmap 知識點梳理

1. 區(qū)別decodeResource()和decodeFile()

這里的區(qū)別不是指方法名和參數(shù)的區(qū)別,而是對于解碼后圖片尺寸在處理上的區(qū)別:

decodeFile()用于讀取SD卡上的圖,得到的是圖片的原始尺寸
decodeResource()用于讀取Res、Raw等資源,得到的是圖片的原始尺寸 * 縮放系數(shù)

可以看的出來,decodeResource()比decodeFile()多了一個縮放系數(shù),縮放系數(shù)的計算依賴于屏幕密度,當然這個參數(shù)也是可以調(diào)整的:

通過BitmapFactory.Options的這幾個參數(shù)可以調(diào)整縮放系數(shù)
public class BitmapFactory {
    public static class Options {
        public boolean inScaled;     // 默認true
        public int inDensity;        // 無dpi的文件夾下默認160
    public int inTargetDensity;  // 取決具體屏幕
        }
}

我們分具體情況來看,現(xiàn)在有一張720×720的圖片:

inScaled屬性

如果inScaled設(shè)置為false,則不進行縮放,解碼后圖片大小為720×720; 否則請往下看。

如果inScaled設(shè)置為true或者不設(shè)置,則根據(jù)inDensity和inTargetDensity計算縮放系數(shù)。

默認情況

把這張圖片放到drawable目錄下, 默認:

以720p的紅米3為例子,縮放系數(shù) = inTargetDensity(具體320 / inDensity(默認160)= 2 = density,解碼后圖片大小為1440×1440。
以1080p的MX4為例子,縮放系數(shù) = inTargetDensity(具體480 / inDensity(默認160)= 3 = density, 解碼后圖片大小為2160×2160。

*dpi文件夾的影響

把圖片放到drawable或者raw這樣不帶dpi的文件夾,會按照上面的算法計算。

如果放到xhdpi會怎樣呢? 在MX4上,放到xhdpi,解碼后圖片大小為1080 x 1080。

因為放到有dpi的文件夾,會影響到inDensity的默認值,放到xhdpi為160 x 2 = 320; 所以縮放系數(shù) = 480(屏幕) / 320 (xhdpi) = 1.5; 所以得到的圖片大小為1080 x 1080。

手動設(shè)置縮放系數(shù)

如果你不想依賴于這個系統(tǒng)本身的density,你可以手動設(shè)置inDensity和inTargetDensity來控制縮放系數(shù):

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 1;
options.inDensity = 160;
options.inTargetDensity = 160;
bitmap = BitmapFactory.decodeResource(getResources(),
    R.drawable.origin, options);
// MX4上,雖然density = 3
// 但是通過設(shè)置inTargetDensity / inDensity = 160 / 160 = 1
// 解碼后圖片大小為720x720
System.out.println("w:" + bitmap.getWidth()
        + ", h:" + bitmap.getHeight());
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容