スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



Graphics.drawImage()の移植 その2

昨日に引き続きMIDPのGraphics.drawImage()の移植。

昨日問題になっていたのは,
「Canvas.drawBitmap()を実行するとBitmapが2倍に表示されてしまう」
というもの。

なぜ2倍に表示されてしまうかについては,
フレームワーク側の見えない処理で悩ましい問題でした。

結果から言うと,
(NDKのソースまではみていないですが...)

1. 転送元のBitmapと転送先のBitmapのdensityの値で拡大縮小処理を実行する。
2. Canvas.scale()に設定した倍率で拡大・縮小される。

ということがわかりました。


BitmapFactory.decodeResource()のResourceを引数にとる方は,
画面のDPIからdensityを設定し,読み込むときはデフォルトの160DPIから換算した大きさに変換します。

どいうことかというと,
今回テストで読み込んだ画像はW240 x H90(いずれもpx)だったのですが,
BitmapFactoryでBitmapを読み込んだところ
W480 x H180になっていました。

これは実行した端末のDPIが320で,デフォルト160の2倍の密度だったため,
自動的に2倍にして読み込まれたということになります。

またBitmapに設定されたdensityは320が設定されます。


このとき描画先のCanvasが320DPIでdensityが設定されているとき,
描画するBitmapのdensityと同じなので,
拡大・縮小処理されずに等倍で描画されます。

しかし,ここでCanvas.scale()が2.0で設定されているとき,
Bitmapはscaleの値によって2倍に描画されてしまいます。


ではscaleを1.0に設定すればいいのでは?
と考えられますが,文字列や座標などdensityを持たないものは
densityによる拡大・縮小がおこわなわれません。

そのためPaint.setTextSize()で12を設定してCanvas.drawText()を実行すると
そのままの大きさで表示されてしまいます。


これでは画面密度ごとに同じサイズで描画することができません。
(px指定したものと同じで,dp指定とは違う)

Canvas.scale()で画面密度に対応する倍率を設定しておけば,
Paint.setTextSize()を指定するコードはそのままに,
勝手に画面に対応した大きさへ拡大・縮小してくれます。
(いわゆるdpで設定したときと同じ効果)


Canvas.scale()を共通した値のままBitmapを描画する

最初に述べたように,

1. 転送元のBitmapと転送先のBitmap(Canvas)のdensityの値で拡大縮小処理を実行する。
2. Canvas.scale()に設定した倍率で拡大・縮小される。

であるから,Bitmapのdensityによる拡大・縮小を実行せず,
すべてCanvas.scale()に設定したスケール処理に任せればよい
ということになります。

そうするには転送元と転送先のdensityの値を同じにする必要があります。
BitmapFactoryでDPIによって拡大した画像が生成されてしまうことを考えると
その分のメモリがもったいないので,実寸大の大きさでBitmapを読み込むことがよいのでは...
と考えました。

それにはBitmapFactory.Optionsを使いBitmapを生成します。

BitmapFactory.OptionsのinScaledをfalseに設定すれば
原寸大の大きさで画像を生成してくれます。
(逆にtrueにしたときディスプレイのDPIで拡大・縮小した画像を生成してくれます)

こうしてできたBitmapは160DPIなので,
転送先が160DPIであればdensityによる拡大・縮小は行われず,
scale()による拡大・縮小だけが行われます。


テストしてわかったことですが,
描画先が160DPIでBitmapが320DPI, Canvas.scale()には2.0を設定したとき,
densityによる縮小処理が実行され,
その後scale()によって拡大されているので,
Bitmapが160DPIのときに比べて画質が粗くなっていました。


ここから先,処理を追うにはC言語で書かれたnative側をみる必要があります。
C言語も読めるのですが,多分ボリュームが多いので読んでる時間を考えると...。

リファレンスを読むより確実なんだけどね。

いまは移植作業を優先だな。
関連記事
スポンサーサイト

テーマ : ゲーム開発
ジャンル : コンピュータ




コメントの投稿

非公開コメント

アクセス
あなたは
キーワード
カテゴリー
最近の記事
リンク
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

WEB検索
Google

RSSフィード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。