昨日の投稿後にいろいろアドバイスを頂きました。
.@kazuakix 308 / 256 = 120%
http://t.co/74YtPfpSw7
— 山本康彦@BluewaterSoft (@biac) 2014, 11月 23
かずあきさん、それは端末の解像度の倍率計算すればいいっすよ
— しばやん (@shibayan) 2014, 11月 22
RawPixelsPerViewPixel を確認する
確かに WVGA のエミュレーターで RawPixelsPerViewPixel を取得すると 1.2 が返ってきていました。
var rppv = DisplayInformation.GetForCurrentView().RawPixelsPerViewPixel;
// WVGA エミュだと 1.2
256 × 256 ピクセルのコントロールが 308 × 308 になっていると計算が合いますね。
コントロールを小さくしてみる
@kazuakix あるいは、取得前にコントロールをリサイズしとくか…
— 山本康彦@BluewaterSoft (@biac) 2014, 11月 23
勝手に大きくなるなら元を小さくすればいいじゃない...という事で、コントロールを 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 はコントロールのサイズ
画面に表示するときは多少サイズが違っても問題になることはないと思いますが、どうしてもサイズ指定した画像が必要な場合の参考になれば。