1. ホーム
  2. c#

[解決済み】画像のペイントにTextureBrushを使用する方法

2022-02-21 14:04:37

質問

GDI+を使って、画像からなる簡単な四角を作ろうとしています。この四角形は移動されます。私が遭遇しているいくつかの問題があります。まず、画像をローカルに参照する方法(常にコピーするように設定されている)、画像を正方形の中央に配置する方法、正方形が移動するときに画像を静止させる方法です。

Bitmap runnerImage = (Bitmap)Image.FromFile(@"newRunner.bmp", true);//this results in an error without full path

TextureBrush imageBrush = new TextureBrush(runnerImage);

imageBrush.WrapMode = System.Drawing.Drawing2D.WrapMode.Clamp;//causes the image to get smaller/larger if movement is tried

Graphics.FillRectangle(imageBrush, displayArea);

wrapMode.clampを使用しない場合、デフォルトはタイリングになり、画像がタイル状になり、四角を動かすと次の画像に移動するように見える

解決方法は?

<ブロッククオート

画像をローカルに参照する方法(常にコピーするように設定されている)

リソースファイルに画像を追加し、そこからコード内でその画像を参照することができます。(参照リンク http://msdn.microsoft.com/en-us/library/7k989cfy%28v=vs.90%29.aspx )

画像を正方形の中央に配置する方法と、画像を正方形の中央に配置する方法です。 が移動しても静止しているか?

これは、displayAreaの位置でTranslateTransformを使用して実現することができます。 (リンク参照 http://msdn.microsoft.com/en-us/library/13fy233f%28v=vs.110%29.aspx )

    TextureBrush imageBrush = new TextureBrush(runnerImage);

    imageBrush.WrapMode = WrapMode.Clamp;//causes the image to get smaller/larger if movement is tried

    Rectangle displayArea = new Rectangle(25, 25, 100, 200); //Random values I assigned

    Point xDisplayCenterRelative = new Point(displayArea.Width / 2, displayArea.Height / 2); //Find the relative center location of DisplayArea
    Point xImageCenterRelative = new Point(runnerImage.Width / 2, runnerImage.Height / 2); //Find the relative center location of Image
    Point xOffSetRelative = new Point(xDisplayCenterRelative.X - xImageCenterRelative.X, xDisplayCenterRelative.Y - xImageCenterRelative.Y); //Find the relative offset

    Point xAbsolutePixel = xOffSetRelative + new Size(displayArea.Location); //Find the absolute location

    imageBrush.TranslateTransform(xAbsolutePixel.X, xAbsolutePixel.Y);

    e.Graphics.FillRectangle(imageBrush, displayArea);
    e.Graphics.DrawRectangle(Pens.Black, displayArea); //I'm using PaintEventArgs graphics

編集:画像サイズは常に<=正方形サイズであると仮定していました。