2013-01-19 41 views
0


我有這樣的圖像:C#作物的圖像中的透明部分

enter image description here

和我寫應該與黑點
(該代碼是專爲1裁剪僅一部分的代碼只有-color圖像),
沒有所有的點周圍的透明像素,
然後對後茬作物返回圖像,
但由於某些原因,當它到達一個黑色像素,
它不承認這是一個黑色像素,
因此,它跳過'if'語句。

下面是代碼:

private Image cropTransparency(Image image) 
    { 
     Bitmap imageCrop = new Bitmap(image); 
     imageCrop.Save(@"C:\Users\Nehoray\Desktop\Test.png"); 
     Point min = new Point(imageCrop.Width, imageCrop.Height); 
     Point max = new Point(imageCrop.Width, imageCrop.Height); 
     for (int w = 0; w < imageCrop.Width; w++) 
     { 
      //'w' stands for Width 
      for (int h = 0; h < imageCrop.Height; h++) 
      { 
       //'h' stands for Height 
       Color check = imageCrop.GetPixel(w, h); 
       if (check == Color.Black) 
       { 
        MessageBox.Show("Found a white pixel!"); 
        if (w < min.X) 
        { 
         min.X = w; 
        } 
        if (h < min.Y) 
        { 
         min.Y = h; 
        } 
        if (w > max.X) 
        { 
         max.X = w; 
        } 
        if (h > max.Y) 
        { 
         max.Y = h; 
        } 
       } 
      } 
     } 
     imageCrop = new Bitmap(max.X - min.X, max.Y - min.Y); 
     Graphics g = Graphics.FromImage(imageCrop); 
     Rectangle cropRect = new Rectangle(new Point(0, 0), new Size(max.X - min.X, max.Y - min.Y)); 
     g.DrawImage(image, new Rectangle(0, 0, max.X - min.X, max.Y - min.Y), cropRect, GraphicsUnit.Pixel); 
     g.Save(); 
     return imageCrop; 
    } 

如果你找出原因時,有一個黑色的像素不承認,請讓我知道..
感謝反正:)

+2

好運點擊了所有的消息框;) – fixagon

回答

2

此代碼存在相當多的問題:

Point max = new Point(imageCrop.Width, imageCrop.Height); 

點將如何變得更大當最大值初始化爲最大值時,最大值是多少?這應該是(0,0)

Color check = imageCrop.GetPixel(w, h); 
if (check == Color.Black) 

我不確定這是否做你認爲它會。你有一個帶有alpha通道的32位圖像,所以你需要考慮alpha值。此外,即使所有4個通道都匹配,您仍將與預定義顏色進行比較,該預定義顏色的參考不會與您的像素匹配。您可能只想檢查alpha分量是否爲非零。如果您只比較顏色通道,請注意透明像素可能具有匹配的顏色,從而產生意想不到的結果。

Rectangle cropRect = new Rectangle(new Point(0, 0), new Size(max.X - min.X, max.Y - min.Y)); 

你爲什麼從0,0裁剪?您的矩形應min.X, min.Y

g.Save(); 

這個開始並不保存圖像,你知道嗎?你保存圖像,在你的代碼開始時不加修改,然後在剪切完成後再次保存它(我假設這些東西,包括硬編碼路徑,用於調試,但即使如此,看起來你可能很可能這意味着在這裏寫圖片)

+0

謝謝你這麼多, 您所有的祕訣幫我解決我的問題! 它現在全部正常工作:) –

+0

只是增加一個性能問題,我認爲GetPixel不適合這種情況。您應該考慮使用Bitmap.LockBits(http://msdn.microsoft.com/en-us/library/5ey6h79d.aspx)以獲得更好的性能。 – Caian

0

您正在比較:(check == Color.Black)這意味着:是指向參考check指向與參考Color.Black相同的實例 - >這永遠不會是真實的。

您要比較實際的顏色:

(check.ToArgb() == Color.Black.ToArgb())