Android画像処理のBitmap類

4907 ワード

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类_第1张图片
図一、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张图片
図2、BitmapFactory.decodeFile()
 
まずinJustDecodeBounds=trueを設定し、decodeFile()を呼び出して画像の基本情報を得る[Step 2~4];
画像の幅(または高さ、または統合)およびターゲットの幅を用いてinSampleSize値を求め、inJustDecodeBounds=falseを設定し、decodeFile()を呼び出して完全な画像データを得る[Step#5~8].
まずスケールを取得し、データを読み込み、大きなスケールで縮小した図を読み込むと、コンテンツリソースが大幅に節約されます.多くのサムネイルを読み込むこともありますが、この効果はさらに顕著になります.
 
二、BitmapとMatrixによる画像変換
BitmapはMatrixと組み合わせて画像の切り取り、回転、スケーリングなどの動作を実現することができる.
Android图像处理之Bitmap类_第3张图片
図三、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类_第4张图片
図四、Bitmap実現回転
 
三、画像ファイルの保存
画像変換後のBitmapのデータは画像圧縮ファイルに保存できます(JPG/PNG).
Android图像处理之Bitmap类_第5张图片
図5、Bitmapデータをファイルに保存する
 
この操作の過程でBitmap.compress()メソッドのパラメータformatは、JPEGまたはPNGフォーマットを設定することができる.qualityは圧縮品質を選択することができる.fOutは出力ストリーム(OutputStream)であり、ここでFileOutputStreamはOutputStreamのサブクラスである.
 
まとめて、Bitmapの使い方を紹介します.Bitmapで画像ファイルの読み取りと書き込みを実現し、Bitmapで画像の剪断、回転、スケール変換を実現します.