2012-04-18 117 views
1

在下面的代碼:GDI +漸變效果

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,你會得到:

macro, less margin http://www.uploadup.com/di-P2ZT.png

+1

添加'g.PixelOffsetMode = PixelOffsetMode.Half;'所以浮點舍入錯誤不是字節。 – 2012-04-18 13:28:29

+0

感謝漢斯, 這降低了保證金的價值9.現在即使有8個差距出現。我仍然可以解釋這一點,並不知道PixelOffsetMode是什麼。你會解釋更多嗎? – hamidi 2012-04-21 08:32:25

+0

我還評論了設置插值模式的線條,這導致邊距必須增加。使用默認插值模式時,邊距必須至少爲18. GDI +中發生了什麼以及我如何在其中找到我的方式? – hamidi 2012-04-21 08:36:01

回答

1

如果你的矩形的界限不是整數這會發生。漸變與它無關。

想象一下:假設您正在繪製一個右邊X = 100.5的矩形,並用白色填充(現有背景爲黑色)。因此,圖形庫(這不是特定於GDI +)將用白色「半填充」最右邊的像素(在X = 100處),這意味着它們將現有黑色與50%的白色混合在一起,因爲灰色。

然後你繪製另一個矩形,它的左邊是X = 100.5。現在,您再次以X = 100的半像素填充像素爲白色,因此圖形庫將採用現有顏色(灰色)並將其與50%白色混合,讓您獲得75%的白色。如果你不想要這種接縫,你必須(a)確保你的矩形重疊一點點,或者(b)手動將你的座標轉到最近的像素,這樣所有的像素都得到了完全書寫而不是混合已有的內容。

+0

謝謝你的回覆。考慮只繪製一個矩形。如果我繪製它以使其不產生任何灰度,那麼繪製兩個矩形不會產生間隙效應,對嗎?所以讓我們將問題簡化爲: 如何從源矩形中繪製圖像,該矩形不是整數,因此不會出現灰度效果。作爲文森特通知[這裏](http://stackoverflow.com/a/10115502/1137082)(0,0)的源圖像定義在我們稱之爲(.5,.5)的地方。所以圖像從(-.5,-5)開始。我期望在上面的代碼中,當我將邊距定義爲...... – hamidi 2012-04-21 09:30:37

+0

...一個像素,並從(.5,.5)開始我的源矩形時,源矩形周圍的一個像素就足以省略灰色效果。換句話說,我沒有從源圖像邊緣開始我的源矩形。確實有相同的顏色(白色)在它周圍有一個像素邊距。當我看到這一個像素是不夠的,我增加了它。但我看到我必須使用較大的餘量才行。這是什麼?這是我的問題。 – hamidi 2012-04-21 09:34:23

+0

以及關於您的建議: a。我不想重疊它們。此外,我不知道他們必須重疊多少纔夠。 b。源矩形不能在整體邊界。考慮當我選擇一個2x2形狀並且想要在3000x3000像素的客戶區域中滾動它。 – hamidi 2012-04-21 09:39:02