2015-10-20 96 views
0

我想在C#中使用Canvas繪製圖片。 我必須控制圖片每個像素的顏色,所以我使用矩形繪製它。爲什麼我不能繪製像素並排像素?

public void AddPixel(Canvas canvas, double x, double y) 
    { 
     Rectangle rec = new Rectangle(); 
     Canvas.SetTop(rec, y); 
     Canvas.SetLeft(rec, x); 
     rec.Width = 1; 
     rec.Height = 1; 
     rec.Fill = new SolidColorBrush(Colors.Black); 
     canvas.Children.Add(rec); 
    } 

應該工作,但是當我要檢查它並繪製單純全黑的畫面:

for (int y = 0; y < 50; y++) 
     { 
      for (int x = 0; x < 50; x++) 
      { 
       AddPixel(MandelbrotCanvas, x, y); 
      } 
     } 

我得到的是這樣的 - 喜歡的東西邊界矩形,空間像素之間:

enter image description here

爲什麼?有人可以幫我畫出一張清晰的黑色照片?

+0

也許它與將'5'而不是'y'傳遞給'AddPixel'方法有關? – BradleyDotNET

+0

我複製了錯誤的代碼。當我使用AddPixel(...,x,y)時,我得到這張圖片 – Blagalin

+2

嘗試添加:'rec.SetValue(RenderOptions.EdgeModeProperty,EdgeMode.Aliased);'。如果這不起作用,請嘗試添加'rec.SnapsToDevicePixels = true;' – cubrr

回答

1

您的圖片顯示,似乎有到位的supersampling一定程度(反鋸齒的方法)。你的1px寬線變得比實際更柔軟。消除鋸齒有助於繪製看起來不像「像素化」的傾斜線。

超級取樣線(放大):

Anti-aliased line

鋸齒線:

Aliased line

設置RenderOptions.EdgeModeProperty,以確保您的矩形是不是反鋸齒:

rec.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased); 

如果還是不行,請嘗試將設置UIElement.SnapsToDevicePixels屬性:

rec.SnapsToDevicePixels = true; 

我會想象這可以防止您的矩形subpixel rendering

0

這一個可以幫助我

rec.SetValue(RenderOptions.EdgeModeProperty, EdgeMode.Aliased);