C#裁剪图像中的透明部分
Posted
技术标签:
【中文标题】C#裁剪图像中的透明部分【英文标题】:C# Crop transparent parts in an image 【发布时间】:2013-01-19 11:20:33 【问题描述】:我有这张图片:
我编写了一个代码,该代码应该只裁剪带有黑点的部分(该代码仅适用于单色图像), 没有点周围的所有透明像素, 然后在裁剪后返回图像, 但是由于某种原因,当它到达黑色像素时, 它无法识别这是一个黑色像素, 因此,它会跳过“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;
如果您发现为什么当有黑色像素时它无法识别,请告诉我.. 无论如何谢谢:)
【问题讨论】:
祝你好运,点击所有消息框;) 【参考方案1】:这段代码有很多问题:
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();
这不会保存图像,你知道吗?您保存图像,在代码开始时未修改,然后在裁剪后永远不会重新保存它(我假设这些东西,包括硬编码的路径,是用于调试的,但即便如此,您似乎也可能意思是在这里写图片)
【讨论】:
非常感谢,您的所有提示帮助我解决了我的问题!现在一切正常:) 只是增加了性能问题,我认为 GetPixel 不适合这种情况。您应该考虑使用 Bitmap.LockBits (msdn.microsoft.com/en-us/library/5ey6h79d.aspx) 以获得更好的性能。【参考方案2】:您正在比较:(check == Color.Black)
,这意味着:引用 check
指向与引用 Color.Black
相同的实例 --> 这永远不会是真的。
你必须比较实际的颜色:
(check.ToArgb() == Color.Black.ToArgb())
【讨论】:
以上是关于C#裁剪图像中的透明部分的主要内容,如果未能解决你的问题,请参考以下文章