Home > 未分類 > AndroidでCanvasにキレイに拡大縮小した画像を描画する方法

AndroidでCanvasにキレイに拡大縮小した画像を描画する方法

  • 2011-09-26 (月) 17:12
  • 未分類

Canvasに拡大縮小した画像を描画する方法は、
Matrixをつかってscaleを調整した画像をCanvasに描画するのが一般的かと思います。

ところが、Matrixでscaleを調整した画像はエッジのところがジャギーっぽくになってしまいました。

そこで、PaintのAntiAliasをオンにしてみたり試して見ましたが、あまり変わりませんでした。
日本Androidの会ではLanczosやBicubicを実装して試してみた方もいらしゃったようです。
画像をきれいに縮小する方法

しかし、ImageViewにBitmapを入れて拡大縮小してもあまりジャギーが気になったことがないのを思い出し、
ImageViewのonDrawの実装を眺めていると以下のことに気づきました。

Canvas.drawBitmap()ではなくBitmapDrawable.draw()で描画している。

さらにBitmapDrawable.draw()の実装を見てみると、
BitmapShaderを使ってレンダリングしているようですが、
要はBitmapDrawableを使えばキレイに拡大縮小した画像を描画できることがわかればよしとします。

実際に描画するコード


//Android2.1
protected void onDraw (Canvas canvas){
    //現在のセーブカウントを保持(カウント=0)
    int count = canvas.getSaveCount();
    //セーブ(カウント=1)
    canvas.save();

    //ResourceからBitmapを生成
    Bitmap bitmap = BitmapFactory.decodeResource(getResource(),R.drawable.icon);
    //BitmapからBitmapDrawableを生成
    BitmapDrawable drawable = new BitmapDrawable(bitmap);
    //drawableの描画領域設定(必須)
    drawable.setBounds(0,0,drawable.getBitmap().getWidth(),drawable.getBitmap().getHeight());
    //bitmapを移動、回転、拡大縮小したい場合はその情報を持ったMatrixをわたす
    canvas.concat(matrix);
    //canvasに描画
    drawable.draw(canvas);

    //リストアする(カウント=0の状態に戻す)
    canvas.restoreToCount(count);
}

はじめにcanvasのセーブカウントを保持しているのは、
上記のViewが仮に子要素を持っていた場合、その子要素内で描画処理をしても、
Canvasの状態を正しい状態に保ってくれるはずです。

下図は上記コードを利用して出力したもので、

  • 画像を2倍にしBitmapDrawableで描画したもの(上)
  • 画像を2倍にしdrawBitmapで描画したもの(真ん中)
  • なにもしていないもの(下)

になります。
BitmaDrawableがキレイに表示されているのがお分かりいただけると思います。

画像をクリックで拡大
device

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://blog.svartalfheim.jp/wp-trackback.php?p=380
Listed below are links to weblogs that reference
AndroidでCanvasにキレイに拡大縮小した画像を描画する方法 from svartalfheim.jp

Home > 未分類 > AndroidでCanvasにキレイに拡大縮小した画像を描画する方法

Search
Feeds
Meta
Licenses
クリエイティブ・コモンズ・ライセンス

Return to page top