- 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がキレイに表示されているのがお分かりいただけると思います。
- Newer: リトルエンディアンとビッグエンディアンの違い
- Older: フェイルファスト(フェイルファースト)とは?
Comments:0
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