次の方法で共有


方法: 自動スケーリングを回避してパフォーマンスを向上させる

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+ で使用される解像度 (通常は 1 インチあたり 96 ドット) が、 Image オブジェクトに格納されている解像度と異なる場合、 DrawImage メソッドはイメージをスケーリングします。 たとえば、 Image オブジェクトの幅が 216 ピクセルで、格納されている水平解像度の値が 72 ドット/インチとします。 216/72 は 3 であるため、 DrawImage は 1 インチあたり 96 ドットの解像度で幅が 3 インチになるようにイメージをスケーリングします。 つまり、 DrawImage は幅が 96 x 3 = 288 ピクセルの画像を表示します。

画面解像度が 96 ドット/インチと異なる場合でも、GDI+ は画面解像度が 96 ドット/インチであるかのようにイメージをスケーリングする可能性があります。 これは、GDI+ Graphics オブジェクトがデバイス コンテキストに関連付けられているためです。GDI+ がデバイス コンテキストに対して画面解像度を照会すると、実際の画面解像度に関係なく、結果は通常 96 になります。 DrawImage メソッドで目的の四角形を指定することで、自動スケーリングを回避できます。

次の例では、同じイメージを 2 回描画します。 最初のケースでは、コピー先の四角形の幅と高さが指定されず、イメージが自動的に拡大縮小されます。 2 番目のケースでは、コピー先の四角形の幅と高さ (ピクセル単位) が、元の画像の幅と高さと同じであることを指定します。 次の図は、2 回レンダリングされた画像を示しています。

テクスチャがスケーリングされた画像を示すスクリーンショット。

Image image = new Bitmap("Texture.jpg");

e.Graphics.DrawImage(image, 10, 10);
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height);
Dim image As New Bitmap("Texture.jpg")

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

コードのコンパイル

前の例は Windows フォームで使用できるように設計されており、PaintEventArgs イベント ハンドラーのパラメーターである ePaintが必要です。 Texture.jpg を、システムで有効なイメージ名とパスに置き換えます。

こちらも参照ください