使用C#中的TextureBrush在不同高度开始的平铺图像问题

时间:2011-09-07 12:26:08

标签: c# image tiling

我正在尝试使用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)开始,但绘制矩形不是从图像的开头开始。它从图像的裁剪部分开始,然后重复。

如何解决这个问题?

P.S:我不想在DrawImage上重复手动循环。

3 个答案:

答案 0 :(得分: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);
}

我发现这个link很有帮助。这详细解释了刷子和变换。

答案 1 :(得分: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);
}

结果:

enter image description here

答案 2 :(得分:1)

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

brush.TranslateTransform(0,50);