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