BitmapFactoryとBitmapにおけるDensityの役割

4296 ワード

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の場合、デコーダはnullを返しますが、outの先頭のパラメータが設定されます.
  • inSampleSizeは、ピクチャをスケーリングするために使用される複数のピクセルを1つのピクセルに解釈することを示す.指定した値に対して、システムは最大2の次を下に探します.大きな画像のサムネイルを取得する必要がある場合は、まずinJustDecodeBoundsをtrueに設定し、元の画像の幅と高さを取得することができます.次にスケーリングの倍数を計算し,inSampleSizeに付与し,inJustDecodeBoundsをfalseとしてBitmapを得る.inSampleSizeの値はシステムによって2の二乗に調整されるので、正確なサイズを得るためにはBitmapのpublic static Bitmap createScaledBitmap (Bitmap src, int dstWidth, int dstHeight, boolean filter)法によってinDensityとinTargetDensityを用いて得ることができる.拡大・縮小前の幅と高さが同じである場合、createScaledBitmapは伝達されたパラメータを返すので、Bitmapのリソースを解放する前に、同じ参照であるかどうかをテストする必要があります.
  • public Bitmap inBitmap 
    //  Android 3.0(API 11) 
    
  • Bitmapを再利用することで、再割り当てとメモリ回収のオーバーヘッドを削減できます.
  • Bitmapはmutableである必要があり、返されるBitmapもmutableである---適用BitmapFactory---
  • Android 4.4(API 19)より前:
  • ピクチャはjpegまたはpngフォーマット
  • でなければなりません.
  • Bitmapのサイズは同じでなければなりません
  • inSampleSizeのサイズは1
  • でなければなりません.
  • 当該BitmapのBitmap.ConfigはinPreferedConfig
  • を上書きします
  • Android 4.4(API 19)以降:BitmapがロードするBitmapより大きい限り---BitmapRegionDecoder---
  • が適用される
  • Android 4.1(API 16)に
  • を導入
  • 提供されるBitmapが小さすぎると、結果は切り取られ、BitmapのアスペクトとConfigは変化しません.
  • public int inDensity 
    public int inTargetDensity 
    public int inScreenDensity 
    public boolean inScaled 
    //  inDensity inTargetDensity , 。
    
  • inDensityは、オリジナルのピクチャが理論的に適切であるべきスクリーンDpiに対応する.Bitmapのdensityの役割は、Bitmapに適した画面Dpiを表し、ターゲット画面のDpiがそれに等しくない場合、ターゲットマシンに適応するためにスケールされます.スケーリングするのは、異なるマシンで同じ物理サイズを表示するためです(Dpiは1インチあたりの画素数を表すため、BitmapのDensity=120、ターゲットマシン=480の場合、Bitmapメソッドの4倍は、ターゲットマシン=120の表示時のサイズサイズに等しい).Bitmapを返すdensityの値は、次の場合によって異なります.
  • inTargetDesityの値がinDesityに等しくなく、したがってピクチャがスケーリングされた場合、Bitmapのdensityの値はinTargetDesityの値である.
  • それ以外の場合、Bitmapのdensityの値はindensityですが、indensityの値が0の場合、Bitmapのdensityの値はターゲットマシンの値です.
  • 注意すると、inDesityは、それらの値が0の場合、以下の方法によって自動的に設定される(保存されたリソースディレクトリ(自分でテストした場合、inDesityは常に160、すなわちデフォルト値))、inTargetDesityは、以下の方法によってターゲットマシンのDpiとして自動的に設定される.

  •  decodeResource(Resources, int)
     decodeResource(Resources, int, android.graphics.BitmapFactory.Options)
    decodeResourceStream(Resources, TypedValue, InputStream, Rect, BitmapFactory.Options)
    
  • inTargetDesityは、対象機器上の画面Dpiに対応する(一般的にgetResources().getDisplayMetrics();取得)
  • inScreenDesityが指定され、その値がinDesityの値に等しい場合、Bitmapはスケールされません.
  • public boolean inMutable 
    //  true, Bitmap Mutable
    public boolean inDither 
    //  true, dither( )
    public boolean inPreferQualityOverSpeed 
    //  true, , 。 JPEG 。
    public boolean inPremultiplied 
    //  true。 Bitmap premultiplied。 false, isScaled true, 。
    public Bitmap.Config inPreferredConfig 
    //  Bitmap.Config
    
    public boolean inPurgeable 
    public boolean inInputShareable 
    // inPurgeable true, , Bitmap , , 。 。
    //  , 。
    // inInputShareable true, Bitmap , 。
    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