[英]GDI+ gradient effect
在下面的代码中:
void f13(Graphics g)
{
g.FillRectangle(new SolidBrush(Color.Black), pictureBox1.ClientRectangle);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
var zf = .0143;
const int w = 6000, h = 10, margin = 40;
var bmp = new Bitmap(w + 2 * margin, h + 2 * margin);
var bmpG = Graphics.FromImage(bmp);
bmpG.FillRectangle(new SolidBrush(Color.White), 0, 0, bmp.Width, bmp.Height);
var srcRect = new RectangleF(margin - .5f, margin - .5f, w, h);
zf = (float)Convert.ToInt32(w * zf) / w;
var destRect = new Rectangle(0, 0, Convert.ToInt32(w * zf), Convert.ToInt32(w * zf));
g.DrawImage(bmp, destRect, srcRect, GraphicsUnit.Pixel);
destRect.X += destRect.Width;
g.DrawImage(bmp, destRect, srcRect, GraphicsUnit.Pixel);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
f13(e.Graphics);
}
我在两个矩形之间出现缝隙:
微型http://www.uploadup.com/di-0HXM.png 宏http://www.uploadup.com/di-G1O5.png
这是为什么?
如果间隙线不太清楚,则可能会减少边距。 如果将其设置为10,您将获得:
如果矩形的边界不是整数,就会发生这种情况。 渐变与它无关。
考虑:假设您要绘制一个矩形,其右侧为X = 100.5,并用白色填充(现有背景为黑色)。 因此,图形库(不是GDI +专用)将用白色“填充”最右边的像素(在X = 100处),这意味着它们会将现有的黑色与50%的白色混合,从而产生灰色。
然后绘制另一个矩形,其左侧为X = 100.5。 现在,您将再次用白色填充X = 100处的像素,因此图形库将采用现有颜色(灰色)并将其与50%白色混合,剩下75%白色。
如果您不希望出现这种接缝,则必须(a)确保矩形重叠一点,或者(b)手动将坐标四舍五入到最近的像素,这样所有像素都将被完全写入而不是与已经存在的东西融为一体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.