Bitmap(三)

4268 ワード

回転元:http://www.open-open.com/lib//view/open1333418945202.html
BitmapはAndroidシステムにおける画像処理の最も重要なクラスの一つである.これにより、画像ファイル情報を取得したり、画像の切り取り、回転、スケールなどの操作を行い、フォーマットを指定して画像ファイルを保存することができます.本稿では,応用の観点から,Bitmapを用いてこれらの機能を実現する方法を重点的に紹介する.
 
一、Bitmapの生成
1.1 BitmapFactory decode出Bitmap
Bitmapはandroidで実現した.graphicsパッケージにあります.しかしBitmapクラスのコンストラクション関数はプライベートであり,外部ではインスタンス化できずJNIによるインスタンス化しかできない.これは必然的にある補助クラスがBitmapを作成するインタフェースを提供し、このクラスの実装はJNIインタフェースによってBitmapをインスタンス化し、このクラスはBitmapFactoryである.
Android图像处理之Bitmap类
図一、BitmapFactory主な方法及びOptionsオプション
 
BitmapFactoryを使用すると、指定したファイルからdecodeFile()を使用してBitmapを解くことができます.定義されたピクチャリソースでは,decodeResource()を用いてBitmapを解くこともできる.
 
1.2 decodeの場合のオプション
メソッドdecodeFile()/decodeResource()を使用する場合、BitmapFacotryを指定できます.Options.
Optionsの次のプロパティを使用して、decodeのオプションを指定します.
  • inPreferredConfigはdecodeをメモリに指定する、携帯電話で採用される符号化、オプション値はBitmapに定義する.Config中.デフォルトはARGB_8888.
  • inJustDecodeBoundsがtrueに設定されていれば、画像のデータを完全に復号することはなく、すなわちdecodeXyz()の戻り値はnullであるが、OptionsのoutAbcでは画像の基本情報が解かれている.
  • inSampleSize decode設定時のスケーリング.

  •  
    Optionsのこれらの値を利用すると、効率的にサムネイルが得られます.
    Android图像处理之Bitmap类
    図2、BitmapFactory.decodeFile()
     
    まずinJustDecodeBounds=trueを設定し、decodeFile()を呼び出して画像の基本情報を得る[Step 2~4];
    画像の幅(または高さ、または統合)およびターゲットの幅を用いてinSampleSize値を求め、inJustDecodeBounds=falseを設定し、decodeFile()を呼び出して完全な画像データを得る[Step#5~8].
    まずスケールを取得し、データを読み込み、大きなスケールで縮小した図を読み込むと、コンテンツリソースが大幅に節約されます.多くのサムネイルを読み込むこともありますが、この効果はさらに顕著になります.
     
    二、BitmapとMatrixによる画像変換
    BitmapはMatrixと組み合わせて画像の切り取り、回転、スケーリングなどの動作を実現することができる.
    Android图像处理之Bitmap类
    図三、Bitmap方法
     
    ソースBitmapを変換して新しいBitmapを生成する方法:1 public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height,  2              Matrix m, boolean filter)  3 public static Bitmap createBitmap(Bitmap source, int x, int y, intwidth, int height)  4 public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,  5              int dstHeight, boolean filter)
     
    第1の方法は最終的な実装であり、後の2つは第1の方法のパッケージにすぎない.
    第2の方法は、ソースBitmapの指定された領域(x,y,width,height)から切り取りを実現するために1つのブロックを掘り出すことができる.第3の方法は、ソースBitmapをdstWidth x dstHeightのBitmapにスケーリングすることができる.
     
    MatrixのRotate(setRotate()またはScale(setScale()を介して)を設定すると、最初のメソッドが入力され、回転またはスケールが実現されます.
    Android图像处理之Bitmap类
    図四、Bitmap実現回転
     
    三、画像ファイルの保存
    画像変換後のBitmapのデータは画像圧縮ファイルに保存できます(JPG/PNG).
    Android图像处理之Bitmap类
    図5、Bitmapデータをファイルに保存する
     
    この操作の過程でBitmap.compress()メソッドのパラメータformatは、JPEGまたはPNGフォーマットを設定することができる.qualityは圧縮品質を選択することができる.fOutは出力ストリーム(OutputStream)であり、ここでFileOutputStreamはOutputStreamのサブクラスである.
     
    まとめて、Bitmapの使い方を紹介します.Bitmapで画像ファイルの読み取りと書き込みを実現し、Bitmapで画像の剪断、回転、スケール変換を実現します.
    Androidでの画像のメモリ使用量の計算
    http://blog.csdn.net/hudashi/article/details/7856519