我有这张图片:
我编写了一个代码,该代码只能裁剪带有黑点的部分
(代码仅针对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;
}
如果您发现有黑色像素时无法识别的原因,请告知我们。
无论如何,谢谢:)
答案 0 :(得分:2)
此代码存在很多问题:
Point max = new Point(imageCrop.Width, imageCrop.Height);
当max被初始化为最大值时,一个点如何大于最大值?这应该是(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();
这不保存图像,你知道吗?您保存图像,在代码开始时不加修改,然后在裁剪后再也不会重新保存(我假设这些东西,包括硬编码路径,用于调试,但即使这样,你似乎也许意思是在这里写图像)
答案 1 :(得分:0)
您正在比较:(check == Color.Black)
这意味着:引用check
是指向与引用Color.Black
相同的实例 - &gt;这永远不会成真。
你必须比较实际颜色:
(check.ToArgb() == Color.Black.ToArgb())