在下面的代码中:
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);
}
我在两个矩形之间产生了差距:
micro http://www.uploadup.com/di-0HXM.png macro http://www.uploadup.com/di-G1O5.png
为什么会这样?
如果间隙线不是那么清楚,您可以减少保证金。如果你把它设置为10,你会得到:
答案 0 :(得分:1)
如果你的矩形边界不是整数,那就会发生。渐变与它无关。
考虑一下:假设你画的是一个右边是X = 100.5的矩形,你用白色填充它(现有的背景为黑色)。所以图形库(这不是GDI +特有的)会用白色“半填充”那些最右边的像素(X = 100),这意味着它们将现有的黑色与50%的白色混合混合,灰色的结果
然后绘制另一个矩形,其左边是X = 100.5。现在你再次用白色填充X = 100的像素,因此图形库将采用现有颜色(灰色)并将其与50%白色混合,留下75%白色。
如果你不想要这种接缝,你必须要么(a)确保你的矩形重叠一点,或者(b)手动将坐标环绕到最近的像素,所以所有的像素都完全得到了写而不是混合已经存在的东西。