kazuakix の日記

Windows Phone とか好きです

Windows Phone 8.1 の RenderTargetBitmap で思い通りの画像サイズにならない話の続き

昨日の投稿後にいろいろアドバイスを頂きました。


RawPixelsPerViewPixel を確認する

確かに WVGA のエミュレーターで RawPixelsPerViewPixel を取得すると 1.2 が返ってきていました。

var rppv = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
// WVGA エミュだと 1.2

256 × 256 ピクセルのコントロールが 308 × 308 になっていると計算が合いますね。
 

コントロールを小さくしてみる

勝手に大きくなるなら元を小さくすればいいじゃない...という事で、コントロールを 256 ピクセル ÷ 1.2 の 213 ピクセルで作ってみました。

この方法はうまくいくのですが、例えばフル HD の Lumia 1520 とかだと RawPixelsPerViewPixel が 2.2 になったりします。コントロールの要素に決め打ちがあったりすると面倒ですね。
 

(解決方法) RenderAsync でサイズを指定する

という訳でいろいろ試行錯誤しているうちに、コントロールのサイズはそのままで RenderAsync メソッドに指定するサイズを小さくしておくことで希望通りのサイズの画像を取得できました。

var rppv   = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
var render = new RenderTargetBitmap();
await render.RenderAsync(this.ImageControl, (int)(width / rppv), (int)(height / rppv)); // width, height はコントロールのサイズ


画面に表示するときは多少サイズが違っても問題になることはないと思いますが、どうしてもサイズ指定した画像が必要な場合の参考になれば。