グラフィックス(6)-Bitmapの描画とMatrixの操作
drawBitmapメソッドの簡単なサンプル
CanvasクラスのdrawBitmapメソッドを使って、Bitmapを描画する事ができます。
以下に、drawBitmapメソッドを使ってBitmapを描画する、簡単なサンプルを示します。
1 | Resources r = getResources(); |
2 | Bitmap bmp = BitmapFactory.decodeResource(r, R.drawable.sample); |
4 | canvas.drawBitmap(bmp, 0 , 0 , null ); |
このプログラムを実行するには、res/drawableデレクトリに、画像ファイルsample.JPGが保存されている必要があります。
画像ファイルは、JPGだけでなくBMP,PNG,GIFも表示可能なようです。
BitmapFactory.decodeResourceメソッドは、res/drawableデレクトリの画像ファイルを、Bitmapオブジェクトとして取得するメソッドです。
drawBitmapメソッドは、CanvasにBitmapオブジェクトを描画するメソッドで、引数の意味については、次の「drawBitmapメソッドのオーバロードメソッド」を参照して下さい。
このプログラムを実行すると、以下のように、画像ファイルsample.JPGが表示されます。

drawBitmapメソッドのオーバロードメソッド
drawBitmapメソッドには、以下のようにオーバロードされたメソッドが存在します。
- void drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
Bitmapをcanvasの座標(left, top)の位置を起点として、描画します。
- void drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint)
Bitmap内の矩形srcで囲まれた領域を、canvasの矩形dst領域に、描画します。
結果としてBitmapの1部の領域を縮小・拡大して、canvasの矩形dst領域に、描画する事になります。
- void drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint)
1つ前のメソッドのdst引数のクラスが、RectクラスではなくRectFクラスに、変わったものです。
- void drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)
matrixオブジェクトの操作に従って、Bitmapを描画します。
- void drawBitmap(int[] colors, int offset, int stride, float x, float y, int width, int height, boolean hasAlpha, Paint paint)
引数colorsで示されるピクセル配列より、Bitmapを描画します。
- void drawBitmap(int[] colors, int offset, int stride, int x, int y, int width, int height, boolean hasAlpha, Paint paint)
1つ前のメソッドのレガシー(従来)バージョンで、引数x,yの型がfloatではなくint型になっています。
- void drawBitmapMesh(Bitmap bitmap, int meshWidth, int meshHeight, float[] verts, int vertOffset, int[] colors, int colorOffset, Paint paint)
BitmapMesh.java - Android Developersにサンプルプログラムがありますが、詳細はよくわかりませんでした。
矩形領域Rectを指定してBitmapの1部の領域を縮小・拡大してcanvasに描画する
次のプログラムは、Bitmap画像の右半分の画像を、縦横それぞれ半分の大きさに縮小して、座標(50, 50)の点を起点として、描画するサンプルです、
1 | int width = bitmap.getWidth(); |
2 | int height = bitmap.getHeight(); |
4 | canvas.drawBitmap(bitmap, new Rect(width / 2 , 0 , width, height), |
5 | new Rect( 50 , 50 , width / 4 + 50 , height / 2 + 50 ), null ); |
このプログラムを実行すると、以下のように画像が表示されます。

Bitmapオブジェクトの新規作成とコピーとBitmapオブジェクト内のcanvasへの描画
Bitmapオブジェクトを新規に作成するには、BitmapクラスのcreateBitmapメソッドを使います。
既存のBitmapオブジェクトをコピーして、新たなBitmapオブジェクトを作成するには、Bitmapクラスのcopyメソッドを使います。
新規に作成したBitmapオブジェクトのCanvasオブジェクトを取得して、図形を描画する事もできます。
以下に、その例を示します。
01 | canvas.drawColor(Color.BLUE); |
05 | Paint paint = new Paint(); |
06 | paint.setColor(Color.GREEN); |
09 | bitmap = Bitmap.createBitmap( 100 , 100 , Bitmap.Config.ARGB_8888); |
10 | bitmapCanvas = new Canvas(bitmap); |
11 | bitmapCanvas.drawColor(Color.BLACK); |
12 | bitmapCanvas.drawCircle( 50 , 50 , 40 , paint); |
13 | canvas.drawBitmap(bitmap, 10 , 10 , null ); |
17 | .decodeResource(getResources(), R.drawable.sample); |
18 | if (!bitmap.isMutable()) { |
19 | bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true ); |
22 | bitmapCanvas = new Canvas(bitmap); |
23 | bitmapCanvas.drawCircle( 50 , 50 , 40 , paint); |
24 | canvas.drawBitmap(bitmap, 10 , 120 , null ); |
18行目のisMutableメソッドは、Bitmapが変更可能かどうかを返します。
Bitmapが変更可能でない場合に、変更可能なコピーを作成して、これに描画しています。
9行目のcreateBitmapメソッドと、19行目のcopyメソッドの引数、Bitmap.Config.ARGB_8888は、
32ビットのARGBデータでBitmapを作成する事を、示しています。
Color値は32ビットのARGBデータですので、通常、このBitmap.Config.ARGB_8888を指定して、Bitmapを作成します。
enum型Bitmap.Configは、Bitmapのピクセルフォーマットを指定するもののようで、他にもALPHA_8,ARGB_4444,RGB_565があり、
それぞれBitmapがARGBの各値に何ビット使用するかを、示しているようです。
22行目~24行目は、BitmapオブジェクトのCanvasオブジェクトを作成し、bitmapCanvas変数に代入して、このbitmapCanvasに対して、すなわちBitmap内に、円を描画した後、
そのBitmapをViewのCanvasに描画しています。
余談ですが、CanvasクラスにはsetBitmapメソッドもあります。
setBitmapメソッドを使うと、上記プログラムの22行目は、以下のコードに置き換えることができます。
1 | bitmapCanvas = new Canvas(); |
2 | bitmapCanvas.setBitmap(bitmap); |
このプログラムを実行すると、以下のように画像が表示されます。

Bitmapオブジェクトの、新規作成とコピーのためのメソッドは幾つかあります。
以下に、その書式を列挙します。
- Bitmap copy(Bitmap.Config config, boolean isMutable)
- static Bitmap createBitmap(Bitmap src)
- static Bitmap createBitmap(int[] colors, int width, int height, Bitmap.Config config)
- static Bitmap createBitmap(int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)
- static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
- static Bitmap createBitmap(int width, int height, Bitmap.Config config)
- static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)
- static Bitmap createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter)
ピクセルによるBitmapの画像の加工
Bitmapクラスには、Bitmapのピクセルデータを取得,設定するメソッドが用意されています。
以下のプログラムは、Bitmapのピクセルデータを取得して、ピクセルデータに修正を加えて、表示するサンプルです。
01 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample); |
03 | if (!bitmap.isMutable()) { |
04 | bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true ); |
07 | int width = bitmap.getWidth(); |
08 | int height = bitmap.getHeight(); |
09 | int [] pixels = new int [width * height]; |
11 | bitmap.getPixels(pixels, 0 , width, 0 , 0 , width, height); |
13 | for ( int y = 0 ; y < height; y++) { |
14 | for ( int x = 0 ; x < width; x++) { |
15 | pixels[x + y * width] ^= 0x00ffffff ; |
19 | bitmap.setPixels(pixels, 0 , width, 0 , 0 , width, height); |
20 | canvas.drawBitmap(bitmap, 0 , 0 , new Paint()); |
ピクセルデータのRGBの値の各ビットの反転を行っています。
getPixelsメソッド,setPixelsメソッドの引数の意味については 、
「
しずくくんのAndroidでゲームプログラミングしてみたいなblog - Bitmap.getPixels()のstride引数の意味がわかった」
が参考になります。
このプログラムを実行すると、以下のような画面が表示されます。

このプログラムは、drawBitmapのオーバロードされたメソッドを使って、以下のように記述する事も可能です。
01 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample); |
03 | if (!bitmap.isMutable()) { |
04 | bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true ); |
07 | int width = bitmap.getWidth(); |
08 | int height = bitmap.getHeight(); |
09 | int [] pixels = new int [width * height]; |
11 | bitmap.getPixels(pixels, 0 , width, 0 , 0 , width, height); |
13 | for ( int y = 0 ; y < height; y++) { |
14 | for ( int x = 0 ; x < width; x++) { |
15 | pixels[x + y * width] ^= 0x00ffffff ; |
19 | canvas.drawBitmap(pixels, 0 , width, 10 , 10 , width, height, true , null ); |
Matrixの操作によるBitmap画像の加工
Matrixオブジェクトを操作すると、Bitmap画像の回転やスケールの変更等の、操作をおこなう事ができます。
以下に、そのプログラムの例を示します。
01 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.sample); |
02 | int width = bitmap.getWidth(); |
03 | int height = bitmap.getHeight(); |
11 | bitmap2 = Bitmap.createBitmap(bitmap, 0 , 0 , width, height, matrix, true ); |
12 | canvas.drawBitmap(bitmap2, 0 , 0 , null ); |
16 | matrix.postScale( 0 .5f, 0 .5f); |
17 | bitmap2 = Bitmap.createBitmap(bitmap, 0 , 0 , width, height, matrix, true ); |
18 | canvas.drawBitmap(bitmap2, 0 , 0 , null ); |
22 | matrix.preScale(- 1 , 1 ); |
23 | bitmap2 = Bitmap.createBitmap(bitmap, 0 , 0 , width, height, matrix, true ); |
24 | canvas.drawBitmap(bitmap2, width / 2 , height / 2 , null ); |
MatrixのpostRotateメソッドを使うと、Bitmapオブジェクトを回転させることができます。
postScaleメソッドを使うと、スケールを変更することができます。
このプログラムを実行すると、以下のような画面が表示されます。

ImageViewウィジェットによるBitmapの描画
ウィジェットを使って、ActivityにBitmapを描画する事もできます。
以下に、そのプログラムの例を示します。
01 | package gudon.sample.imageview; |
03 | import android.app.Activity; |
04 | import android.graphics.Bitmap; |
05 | import android.graphics.BitmapFactory; |
06 | import android.os.Bundle; |
07 | import android.widget.ImageView; |
09 | public class ImageViewSample extends Activity { |
12 | public void onCreate(Bundle savedInstanceState) { |
13 | super .onCreate(savedInstanceState); |
14 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample); |
15 | ImageView imageView = new ImageView( this ); |
16 | imageView.setImageBitmap(bitmap); |
18 | setContentView(imageView); |
その他
Bitmapを描画するには、他にもDrawableを使う手もあります。
これについては、グラフィックス(7)-Drawableによる描画を参照して下さい。
Bitmap#compressメソッドを使って、JPEG,PNGファイルとして保存する事もできるようです。
参考URL