次の方法で共有


自動スケーリングの解除によるパフォーマンスの向上

GDI+ では、イメージの左上隅の値を DrawImage メソッドに渡すだけでイメージがスケーリングされることがありますが、その場合のパフォーマンスは低下します。

次の DrawImage メソッドの呼び出しでは、左上隅の値 (50, 30) を指定していますが、描画先の四角形は指定していません。

e.Graphics.DrawImage(image, 50, 30) ' upper-left corner at (50, 30)
[C#]
e.Graphics.DrawImage(image, 50, 30);  // upper-left corner at (50, 30)

これは、指定する引数の数が少なくて済むという点では一番簡単な形式の DrawImage メソッドですが、必ずしも効率的な形式ではありません。GDI+ によって使用される解像度 (通常は 96 dpi) が Image オブジェクトに格納されている解像度と異なる場合、イメージは DrawImage によってスケーリングされます。たとえば、Image オブジェクトの幅が 216 ピクセルで、格納されている水平方向の解像度の値が 72 dpi であるとします。216/72 は 3 なので、DrawImage は、96 dpi の解像度で幅が 3 インチになるようにイメージをスケーリングします。つまり、DrawImage は、96 x 3 = 288 ピクセルの幅でイメージを表示します。

画面解像度が 96 dpi ではない場合でも、GDI+ は解像度が 96 dpi であるものとしてイメージをスケーリングします。これは、GDI+ Graphics オブジェクトがデバイス コンテキストに関連付けられているからです。一般的に、GDI+ がデバイス コンテキストに画面解像度を照会すると、実際の画面解像度がどうなっているかにかかわらず、結果は 96 になります。

このようなスケーリングを行わないようにするには、描画先の四角形の幅と高さを DrawImage メソッドに渡します。同じイメージを 2 回描画する例を次に示します。1 回目は、描画先の四角形の幅と高さを指定していないため、イメージが自動的にスケーリングされます。2 回目には、描画先の四角形の幅と高さ (ピクセル単位) が、元のイメージの幅と高さと同じになるように指定されています。

Dim image = New Bitmap("Texture.jpg")

e.Graphics.DrawImage(image, 10, 10)
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height)
[C#]
Image image = new Bitmap("Texture.jpg");

e.Graphics.DrawImage(image, 10, 10);
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height);

2 回描画された結果のイメージを次の図に示します。