我正面临一个非常令人困惑的问题..
我有一个.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)
}
答案 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 +在边缘翻转图像,这样当它缩放图像时,它会在边缘处拾取更多黑色而不会褪色。