Graphics.DrawImage создает градиент альфа-канала в C # WinForms 2.0 - PullRequest
2 голосов
/ 27 ноября 2011

Я столкнулся с действительно сложной проблемой ..

У меня есть проект .Net 2.0 C # WinForms. Я пытаюсь растянуть растровое изображение в области рисования, но по какой-то причине оно растягивается неправильно - я получаю градиент альфа-канала на правом и нижнем полях моей области рисования.

Мне потребовалось много времени, чтобы изолировать эту проблему. Я создаю несколько строк кода, которые воспроизводят проблему (см. Фрагмент кода и снимок экрана ниже).

Кто-нибудь может пролить свет на этот вопрос?

Заранее спасибо.

-

private void Form1_Paint( object sender, PaintEventArgs e )
{
    // Create a black bitmap resource sized 10x10
    Image resourceImg = new Bitmap( 10, 10 );
    Graphics g = Graphics.FromImage( resourceImg );
    g.FillRectangle( Brushes.Black, 0, 0, resourceImg.Width, resourceImg.Height );

    Rectangle drawingArea = new Rectangle( 0, 0, 200, 200 ); // Set the size of the drawing area
    e.Graphics.FillRectangle( Brushes.Aqua, drawingArea );   // Fill an aqua colored rectangle
    e.Graphics.DrawImage( resourceImg, drawingArea );        // Stretch the resource image

    // Expected result: The resource image should completely cover the aqua rectangle.
    // Actual Result:   The right and bottom edges become gradiently transparent (revealing the aqua rectangle under it)
}

DrawImage Problem

1 Ответ

4 голосов
/ 27 ноября 2011

Поведение связано с тем, как GDI + обрабатывает края.В этом случае вы масштабируете очень маленькое изображение на большой площади, и вы не сказали GDI +, как обрабатывать края.Если вы используете класс ImageAttributes и правильно настроите WrapMode, вы можете обойти эту проблему.

Например:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    using (var resourceImg = new Bitmap(10, 10))
    {
        using (var g = Graphics.FromImage(resourceImg))
        {
            g.FillRectangle(Brushes.Black, 0, 0, 
                resourceImg.Width, resourceImg.Height);
        }

        var drawingArea = new Rectangle(0, 0, 200, 200);
        e.Graphics.FillRectangle(Brushes.Aqua, drawingArea);

        using (var attribs = new ImageAttributes())
        {
            attribs.SetWrapMode(WrapMode.TileFlipXY);
            e.Graphics.DrawImage(resourceImg, drawingArea, 
                    0, 0, resourceImg.Width, resourceImg.Height, 
                    GraphicsUnit.Pixel, attribs);
        }
    }    
}

Приведенный выше код должен создать полностью черное изображение.Если вы закомментируете оператор attribs.SetWrapMode(WrapMode.TileFlipXY);, вы должны увидеть синий градиент.С установленным режимом обтекания вы говорите GDI + перевернуть изображение по краям, чтобы оно получало больше черного и не затухало на краях при масштабировании изображения.

...