BitmapFactory和Bitmap中Density的作用

BitmapFactory方法

public static Bitmap decodeByteArray (byte[] data, int offset, int length, BitmapFactory.Options opts)
public static Bitmap decodeByteArray (byte[] data, int offset, int length)

public static Bitmap decodeFile (String pathName)
public static Bitmap decodeFile (String pathName, BitmapFactory.Options opts)

public static Bitmap decodeFileDescriptor (FileDescriptor fd)
public static Bitmap decodeFileDescriptor (FileDescriptor fd, Rect outPadding, BitmapFactory.Options opts)

public static Bitmap decodeResource (Resources res, int id, BitmapFactory.Options opts)
public static Bitmap decodeResource (Resources res, int id)

public static Bitmap decodeResourceStream (Resources res, TypedValue value, InputStream is, Rect pad, BitmapFactory.Options opts)

public static Bitmap decodeStream (InputStream is)
public static Bitmap decodeStream (InputStream is, Rect outPadding, BitmapFactory.Options opts)

BitmapFactory.Options


public boolean inJustDecodeBounds 
public int inSampleSize 
  • 如果inJustDecodeBounds為true搏嗡,解碼器會(huì)返回null筷厘,但是out開(kāi)頭的參數(shù)會(huì)被設(shè)置瞭稼。
  • inSampleSize表示把多少個(gè)像素解釋成一個(gè)像素杉畜,用來(lái)縮放圖片湿弦。對(duì)于指定的值,系統(tǒng)會(huì)向下尋找最大的2的次方凿将。
    如果需要獲得一個(gè)大圖片的縮略圖校套,可以首先把inJustDecodeBounds設(shè)為true,獲取原始圖片的寬和高牧抵。然后計(jì)算縮放的倍數(shù)笛匙,賦給inSampleSize,并把inJustDecodeBounds設(shè)為false灭忠,得到Bitmap膳算。因?yàn)閕nSampleSize的值會(huì)被系統(tǒng)調(diào)整到2的次方,所以為了得到精確的大小弛作,可以通過(guò)Bitmap的public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)方法來(lái)得到或者使用inDensity和inTargetDensity得到。
    注意华匾,如果縮放前的寬和高相同映琳,那么createScaledBitmap返回傳遞的參數(shù),所以在釋放Bitmap的資源前蜘拉,需要測(cè)試它們是否為同一個(gè)引用萨西。
public Bitmap inBitmap 
// 在A(yíng)ndroid 3.0(API 11)中被添加
  • 重用該Bitmap,減少了重新分配和內(nèi)存回收的開(kāi)銷(xiāo)旭旭。
  • 該Bitmap必須是mutable谎脯,且返回的Bitmap也是mutable
    --- 適用BitmapFactory-----
  • 在A(yíng)ndroid 4.4(API 19)之前:
    • 圖片必須是jpeg或png格式
    • 兩個(gè)Bitmap的大小必須相同
    • inSampleSize的大小必須為1
    • 該Bitmap的Bitmap.Config會(huì)覆蓋inPreferedConfig
  • 在A(yíng)ndroid 4.4(API 19)及其之后:只要該Bitmap大于要加載的Bitmap即可
    --- 適用BitmapRegionDecoder ----
  • 在A(yíng)ndroid 4.1(API 16)中引入
  • 如果提供的Bitmap太小,那么結(jié)果會(huì)被剪切持寄,同時(shí)Bitmap的高寬和Config都不會(huì)變源梭。
public int inDensity 
public int inTargetDensity 
public int inScreenDensity 
public boolean inScaled 
// 表示當(dāng)inDensity和inTargetDensity的值不同時(shí),是否縮放稍味。
  • inDensity對(duì)應(yīng)的應(yīng)該是原始圖片理論上應(yīng)該適配的屏幕Dpi废麻。
    Bitmap的density的作用是:表示該Bitmap適合的屏幕Dpi,當(dāng)目標(biāo)屏幕的Dpi不等于它時(shí)模庐,會(huì)縮放以適應(yīng)目標(biāo)機(jī)器烛愧。之所以會(huì)縮放,是為了在不同的機(jī)器上顯示相同的物理大小(因?yàn)镈pi表示每英寸的像素?cái)?shù)怜姿,如果Bitmap的Density=120慎冤,目標(biāo)機(jī)器=480,那么Bitmap方法4倍沧卢,正好等于在目標(biāo)機(jī)器=120顯示時(shí)的尺寸大幸系獭)。
    返回Bitmap的density的值取決于下列情況:
    • 如果inTargetDensity值不等于inDensity搏恤,且因此而縮放了圖片违寿,那么Bitmap的density的值為inTargetDensity的值。
    • 否則熟空,Bitmap的density的值為inDensity藤巢,但如果inDensity的值為0,那么Bitmap的density值為目標(biāo)機(jī)器的值息罗。
    • 注意掂咒,在它們的值為0時(shí),inDensity會(huì)被以下方法自動(dòng)設(shè)置(根據(jù)存放的資源目錄(我自己測(cè)試時(shí)inDensity永遠(yuǎn)是160迈喉,即默認(rèn)值))绍刮,inTargetDensity被以下方法自動(dòng)設(shè)置為目標(biāo)機(jī)器的Dpi。
 decodeResource(Resources, int)
 decodeResource(Resources, int, android.graphics.BitmapFactory.Options)
decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options)
  • inTargetDensity對(duì)應(yīng)的是目標(biāo)機(jī)器上的屏幕Dpi(一般通過(guò)getResources().getDisplayMetrics();獲劝っ)
  • inScreenDensity如果被指定孩革,且它的值等于inDensity的值,則Bitmap不會(huì)被縮放得运。
public boolean inMutable 
// 如果為true膝蜈,返回的Bitmap是Mutable
public boolean inDither 
// 如果為true,則解碼器在解碼時(shí)會(huì)對(duì)圖像dither(抖動(dòng)處理)
public boolean inPreferQualityOverSpeed 
// 如果為true熔掺,則會(huì)得到更高的質(zhì)量饱搏,會(huì)降低解碼速度。只對(duì)JPEG有效置逻。
public boolean inPremultiplied 
// 默認(rèn)為true推沸。所有要顯示的Bitmap必須為premultiplied。如果該值設(shè)為false券坞,且isScaled為true鬓催,可能會(huì)出現(xiàn)不正確的顏色。
public Bitmap.Config inPreferredConfig 
// 指定Bitmap.Config
public boolean inPurgeable 
public boolean inInputShareable 
// inPurgeable如果為true报慕,表示在系統(tǒng)內(nèi)存不足時(shí)深浮,可以回收Bitmap中像素所占內(nèi)存,當(dāng)再次訪(fǎng)問(wèn)像素時(shí)眠冈,會(huì)重新解碼飞苇。下面的方法會(huì)忽略該參數(shù)菌瘫。
// 如果要重新解碼,必須要有已編碼數(shù)據(jù)布卡。
// inInputShareable如果為true雨让,表示Bitmap保存一個(gè)引用到已編碼數(shù)據(jù),否則進(jìn)行一個(gè)深拷貝忿等。
decodeResource(Resources, int, android.graphics.BitmapFactory.Options)
decodeFile(String, android.graphics.BitmapFactory.Options).
public int outHeight 
public int outWidth 
public String outMimeType 

參考
http://bbs.utest.qq.com/?p=41

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末栖忠,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贸街,更是在濱河造成了極大的恐慌庵寞,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件薛匪,死亡現(xiàn)場(chǎng)離奇詭異捐川,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)逸尖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)古沥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娇跟,你說(shuō)我怎么就攤上這事岩齿。” “怎么了苞俘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵盹沈,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吃谣,道長(zhǎng)襟诸,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任基协,我火速辦了婚禮,結(jié)果婚禮上菇用,老公的妹妹穿的比我還像新娘澜驮。我一直安慰自己,他們只是感情好惋鸥,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布杂穷。 她就那樣靜靜地躺著,像睡著了一般卦绣。 火紅的嫁衣襯著肌膚如雪耐量。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天滤港,我揣著相機(jī)與錄音廊蜒,去河邊找鬼趴拧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛山叮,可吹牛的內(nèi)容都是我干的著榴。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼屁倔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼脑又!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锐借,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤问麸,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钞翔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體严卖,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年嗅战,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妄田。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡驮捍,死狀恐怖疟呐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情东且,我是刑警寧澤启具,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站珊泳,受9級(jí)特大地震影響鲁冯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜色查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一薯演、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秧了,春花似錦跨扮、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至晶通,卻和暖如春璃氢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狮辽。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工一也, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巢寡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓塘秦,卻偏偏與公主長(zhǎng)得像讼渊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尊剔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容