3

我正在尝试使用 TextureBrush 在尺寸宽度 = 1000、高度 = 16 的矩形区域上平铺图像(16x16)以获得类似 UI 的条带。

 Rectangle myIconDrawingRectangle = new Rectangle(x, y, 1000, 16);
 using (TextureBrush brush = new TextureBrush(myIcon, WrapMode.Tile))
 {
    e.Graphics.FillRectangle(brush, myIconDrawingRectangle );
 }

当我用 x=0 绘制时,y=0 平铺按预期从 (0,0) 开始发生。

当我用 x=0 绘制时,y=50 平铺从 (0,50) 开始,但绘画矩形不是从图像的开头开始的。它从图像的裁剪部分开始,然后重复。

如何解决这个问题?

PS:我不想在 DrawImage 上重复手动循环平铺它。

4

3 回答 3

10

为了确保矩形的开头从图像的开头开始,我们使用了转换,如下面的代码所示。

Rectangle myIconDrawingRectangle = new Rectangle(x, y, 1000, 16);
using (TextureBrush brush = new TextureBrush(myIcon, WrapMode.Tile))
{
    brush.TranslateTransform(x,y);
    e.Graphics.FillRectangle(brush, myIconDrawingRectangle);
}

我发现这个链接很有帮助。这详细解释了画笔和变换。

于 2011-09-08T15:25:47.423 回答
3

我在 Windows 窗体应用程序中尝试了这个,它按预期工作,当 y == 14 时在 (0, 14) 处绘制y。在分配它的时间和时间之间是否有可能设置为 16、32 等创建矩形?

这是我用来测试的代码:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    Image myIcon = Image.FromFile(@"C:\Users\me\Pictures\test.jpg");

    int x = 0;
    int y = 14;

    Rectangle myIconDrawingRectangle = new Rectangle(x, y, 1000, 16);
    using (TextureBrush brush = new TextureBrush(myIcon, WrapMode.Tile))
    {
        e.Graphics.FillRectangle(brush, myIconDrawingRectangle);
    }

    e.Graphics.DrawLine(Pens.Black, 0, 16, 1000, 16);
}

结果:

在此处输入图像描述

于 2011-09-07T13:50:24.683 回答
1

使用 TransalteTransform() 设置起点,如果你不这样做,平铺会有一些偏移,以纠正这一点,如下所示:

brush.TranslateTransform(0,50);
于 2012-08-15T08:43:33.280 回答