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開頭的參數(shù)會(huì)被設(shè)置。
  • inSampleSize表示把多少個(gè)像素解釋成一個(gè)像素,用來縮放圖片。對(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的次方,所以為了得到精確的大小,可以通過Bitmap的public static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)方法來得到或者使用inDensity和inTargetDensity得到。
    注意,如果縮放前的寬和高相同,那么createScaledBitmap返回傳遞的參數(shù),所以在釋放Bitmap的資源前,需要測試它們是否為同一個(gè)引用。
public Bitmap inBitmap 
// 在Android 3.0(API 11)中被添加
  • 重用該Bitmap,減少了重新分配和內(nèi)存回收的開銷。
  • 該Bitmap必須是mutable,且返回的Bitmap也是mutable
    --- 適用BitmapFactory-----
  • 在Android 4.4(API 19)之前:
    • 圖片必須是jpeg或png格式
    • 兩個(gè)Bitmap的大小必須相同
    • inSampleSize的大小必須為1
    • 該Bitmap的Bitmap.Config會(huì)覆蓋inPreferedConfig
  • 在Android 4.4(API 19)及其之后:只要該Bitmap大于要加載的Bitmap即可
    --- 適用BitmapRegionDecoder ----
  • 在Android 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í)的尺寸大?。?br> 返回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ù)存放的資源目錄(我自己測試時(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(一般通過getResources().getDisplayMetrics();獲?。?/li>
  • 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)再次訪問像素時(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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