Bitmapの回転表示

Canvasに画像を45度や90度など回転させて表示するにはいくつか方法があります。

それが次の2つです。

画像描画の時だけCanvasを回転させる方法

1つめは描画に使うCanvas自体を回転させてしまう方法です。ただし回転するのは画像だけなので回転前に状態を保存して回転後に保存したのを復元してあげます。

例えば元画像をそれぞれ45度、90度だけ回転した画像を表示するには次のようなコードが書けます。

Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    //元画像

canvas.drawBitmap(originalBitmap, 30, 30, null);
    //元画像を描画

canvas.save(Canvas.MATRIX_SAVE_FLAG);
    //キャンバス全体を保存
canvas.rotate(45, 60 + originalBitmap.getWidth() / 2, 30 + originalBitmap.getHeight() / 2);
    //45度回転
canvas.drawBitmap(originalBitmap, 60, 30, null);
canvas.restore();
    //回転画像だけそのままにしてキャンバスを復元する

canvas.save(Canvas.MATRIX_SAVE_FLAG);
canvas.rotate(90, 60 + originalBitmap.getWidth() / 2, 30 + originalBitmap.getHeight() / 2);
    //90度回転
canvas.drawBitmap(originalBitmap, 60, 30, null);
canvas.restore();

この例ではCanvassaveメソッドを使って画像回転前にいったんすべての内容を保存してrotateメソッドで画像を回転させます。その後restoreメソッドを呼び出せば回転させた画像以外はもとに戻ります。

この方法では画像を回転させるときの基準点はビューの左上が(0, 0)となっているのでビューから見た画像の左上座標に画像から見た画像の中心座標を足すことで画像のちょうど中心を回転の基準点にすることができます。

ビューには次の3つの画像が表示されます。

左から0度、45度、90度回転させた画像

左から順に回転無し、45度回転、90度回転の画像になっています。

画像自体を回転させる方法

1つめはもとの画像をコピーしてコピー画像を回転させるという方法です。(注意 : この方法は不正確なうえ、Android2.0以下ではうまく動作しない可能性があるので使わない方がいいかもしれません。)

この方法で元画像を45度だけ回転させた画像を作るには次のようなコードを書きます。

Bitmap originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
    //元画像
Bitmap rotateBitmap = originalBitmap.copy(Bitmap.Config.ARGB_8888, true);
    //回転させる画像
Canvas tmpCanvas = new Canvas(rotateBitmap);
tmpCanvas.rotate(45, totateBitmap.getWidth() / 2, rotateBitmap.getHeight() / 2);
    //45度回転
tmpCanvas.drawBitmap(rotateBitmap, 0, 0, null);
    //キャンバスから回転した元画像を取得

canvas.drawBitmap(originalBitmap, 30, 30, null);
canvas.drawBitmap(rotateBitmap, 60, 30, null);

この例ではBitmapからCanvasインスタンス(描画しているCanvasとは別物)を取得して、そのキャンバス内でrotateメソッドを使って画像を回転させています。このメソッドには回転させる角度と画像から見た回転の中心座標を渡せばOKです。

キャンバス内で画像を回転させたのでBitmap自身がキャンバスによって書き換えられるので45回転したBitmapを取得できます。

キャンバスには次の2つの画像が表示されます。

左から順に0度、45度回転の画像

左から順に回転無し、45度回転の画像です。Androidのバグなのか45度回転の画像は少し乱れています。

この方法は正確でないので、あまり使わない方が良いかもしれません。

関連項目
プライバシーポリシー