Проблема в мозаичном изображении, начинающемся на другой высоте, используя TextureBrush в C # - PullRequest
3 голосов
/ 07 сентября 2011

Я пытаюсь нанести изображение (16x16) на область прямоугольника с размерами width = 1000, height = 16, используя TextureBrush, чтобы получить полосу, похожую на пользовательский интерфейс.

 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 ]

10 голосов
/ 08 сентября 2011

Чтобы убедиться, что начало прямоугольника начинается с начала изображения, мы используем преобразования, как показано в приведенном ниже коде.

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);
}

Я нашел эту ссылку полезной.Это объясняет о кистях и преобразованиях в деталях.

3 голосов
/ 07 сентября 2011

Я пробовал это в приложении Windows Forms, и оно работает как положено, рисуя в (0, 14), когда y == 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

1 голос
/ 15 августа 2012

с использованием TransalteTransform () для установки начальной точки, если вы этого не сделаете, у плитки будет некоторое смещение, чтобы обойти это, как показано ниже:

...