Graphics.DrawImage在C#WinForms 2.0中生成alpha通道渐变

时间:2011-11-27 01:37:54

标签: c# winforms graphics .net-2.0 drawimage

我正面临一个非常令人困惑的问题..

我有一个.Net 2.0 C#WinForms项目。 我正在尝试将位图拉伸到绘图区域,但由于某种原因它没有正确拉伸 - 我在绘图区域的右边距和下边距上获得了alpha通道渐变。

我花了很长时间来解决这个问题。我创建了几行代码来重现问题(请参阅下面的代码片段和截图)。

有人可以就这件事情说清楚吗?

提前致谢。

-

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 个答案:

答案 0 :(得分:4)

行为与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 +在边缘翻转图像,这样当它缩放图像时,它会在边缘处拾取更多黑色而不会褪色。