2

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

我有一个 .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)
}

绘制图像问题

4

1 回答 1

5

该行为与 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+ 在边缘翻转图像,这样它会在缩放图像时拾取更多的黑色并且不会在边缘淡出。

于 2011-11-27T03:23:44.587 回答