ページ 11

【C#/WPF】画像サイズの挙動について

Posted: 2013年6月15日(土) 02:42
by SUE
こんばんは。今回はWPFを使っていたときの問題です。

WPFのImageコントロールに画像を読み込んだとき、例えば64x64の画像であれば、勝手に85x85にリサイズされてしまいます。StretchをNONEにしてもUniformにしても無駄でした。
論理ピクセルと物理ピクセルの兼ね合いの問題なのかなと思いきや、その他の場面でpixelを指定すると全て物理ピクセルと1:1でちゃんと表示されました。
結果、全体としては表示が乱れて思うような操作ができません。

この挙動について、解決策をどうかご教示お願いします。

Re: 【C#/WPF】画像サイズの挙動について

Posted: 2013年6月15日(土) 09:45
by 雨ガエル
WPFはあまり使ったことが無いのですが、試してみました。
自分の環境ではBMP画像を指定すると拡大されて表示されました。

これはBMPファイルの解像度の情報を元に描画していて、
その解像度とディスプレイの解像度に違いがあることによって生じる問題らしいです。

解決策としては、
1. PNGやJpg形式の画像を使う
2. bmpの解像度をディスプレイに合わせる
だと思います。

参考URL:Bitmap(ビットマップ)ファイルをDrawImageで描画すると勝手に拡大・縮小されてしまう - DrawImageで描画される画像の大きさが変わる
参考URL2:[C#] ビットマップ画像の解像度をディスプレイの解像度に合わせて画面に描画する

Re: 【C#/WPF】画像サイズの挙動について

Posted: 2013年6月15日(土) 11:02
by YuO
SUE さんが書きました:WPFのImageコントロールに画像を読み込んだとき、例えば64x64の画像であれば、勝手に85x85にリサイズされてしまいます。StretchをNONEにしてもUniformにしても無駄でした。
論理ピクセルと物理ピクセルの兼ね合いの問題なのかなと思いきや、その他の場面でpixelを指定すると全て物理ピクセルと1:1でちゃんと表示されました。
結果、全体としては表示が乱れて思うような操作ができません。
この,85x85というのはどのようにして測定された値でしょうか。
こちらで単純にImageやViewBoxに入れたImageに,64x64の画像をSourceに設定し,
ActualWidth/ActualHeightのプロパティ値を調べても,ほぼ64 (8/1000ほど大きな値が返ってきました) になります。
これは,100%/125%どちらの環境でも同じ値になります。
デバイス非依存ピクセルの値を取得しているのですから当然と言えば当然ですが。

で,各Visualの物理ピクセルでの大きさを取得するのは面倒なので,ウィンドウについて幅と高さをWin32 APIを介して取得すると,
(Win32の取得値) / (WPFのデバイス非依存ピクセルでの取得値)がWindowsのスケーリング値になります。
おそらく,内部のVisualのスケーリングもこの値と同じでしょう。

それを元にすると,85x85というのは奇妙に思えます。
これが物理ピクセルの大きさだとすると,カスタムスケーリングで133%を指定しているのでしょうか。

なお,100%/125%ともにWindows 8 Professionalで,Windowsがデフォルトでこれらの値を設定する環境において実行しています。