方法 : 自動スケーリングを解除してパフォーマンスを向上させる
GDI+ では、イメージを描画すると自動的にそのイメージがスケーリングされ、これによりパフォーマンスが低下する場合があります。 別の方法として、描画先の四角形の寸法を DrawImage メソッドに渡すと、イメージのスケーリングを制御できます。
たとえば、次の DrawImage メソッドの呼び出しでは、左上隅の値 (50, 30) を指定していますが、描画先の四角形は指定していません。
e.Graphics.DrawImage(image, 50, 30) ' upper-left corner at (50, 30)
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 × 3 = 288 ピクセルの幅でイメージを表示します。
画面解像度が 96 dpi ではない場合でも、GDI+ は解像度が 96 dpi であるものとしてイメージをスケーリングします。 これは、GDI+ Graphics オブジェクトがデバイス コンテキストに関連付けられているためです。一般的に、GDI+ がデバイス コンテキストに画面解像度を照会すると、実際の画面解像度がどうなっているかにかかわらず、結果は 96 になります。 DrawImage メソッドで描画先の四角形を指定すると、自動スケーリングを解除できます。
使用例
同じイメージを 2 回描画する例を次に示します。 1 回目は、描画先の四角形の幅と高さを指定していないため、イメージが自動的にスケーリングされます。 2 回目には、描画先の四角形の幅と高さ (ピクセル単位) が、元のイメージの幅と高さと同じになるように指定されています。 2 回描画された結果のイメージを次の図に示します。
Dim image As New Bitmap("Texture.jpg")
e.Graphics.DrawImage(image, 10, 10)
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height)
Image image = new Bitmap("Texture.jpg");
e.Graphics.DrawImage(image, 10, 10);
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height);
コードのコンパイル
前述の例は Windows フォームと一緒に使用することが想定されていて、Paint イベント ハンドラーのパラメーターである PaintEventArgs e が必要です。 Texture.jpg は、システム上で有効なイメージの名前とパスに置き換えてください。