[英]C# Crop transparent parts in an image
我有這張圖片:
我寫了一個代碼,應該只裁剪帶黑點的部分
(代碼僅適用於 1 色圖像),
沒有圍繞點的所有透明像素,
然后在裁剪后返回圖像,
但由於某種原因,當它到達黑色像素時,
它無法識別這是一個黑色像素,
因此,它會跳過“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;
}
如果您發現為什么當有黑色像素時它無法識別,請告訴我..
不管怎么說,還是要謝謝你 :)
這段代碼有很多問題:
Point max = new Point(imageCrop.Width, imageCrop.Height);
當最大值被初始化為最大值時,一個點將如何大於最大值? 這應該是(0,0)
Color check = imageCrop.GetPixel(w, h);
if (check == Color.Black)
我不確定這是否會如您所願。 您有一個 32 位圖像,帶有 alpha 通道,因此您需要考慮 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();
這不會保存圖像,你知道嗎? 您保存圖像,在代碼開始時未修改,然后在裁剪后永遠不會重新保存它(我假設這些東西,包括硬編碼的路徑,是用於調試的,但即便如此,您似乎也可能意思是在這里寫圖像)
您正在比較: (check == Color.Black)
這意味着:參考check
指向與參考Color.Black
相同的實例——>這永遠不會是真的。
你必須比較實際的顏色:
(check.ToArgb() == Color.Black.ToArgb())
private Image cropTransparency(Image image)
{
Bitmap imageCrop = new Bitmap(image); // aca paso la imagen original a Bitmap
//imageCrop.Save(@"tmp.png");
Point min = new Point(imageCrop.Width, imageCrop.Height);
Point max = new Point(0, 0);
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.FromArgb(255, 0, 0, 0))
{
Console.WriteLine("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(min.X,min.Y), 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.