C#裁剪图像中的透明部分
C#裁剪图像中的透明部分,c#,image,transparent,crop,pixels,C#,Image,Transparent,Crop,Pixels,我有这样的图像: 我写了一个代码,该代码应该只裁剪带有黑点的部分(该代码只针对单色图像构建), 没有圆点周围的所有透明像素, 然后在裁剪后返回图像, 但由于某种原因,当它变成黑色像素时, 它无法识别这是黑色像素, 因此,它跳过了“if”语句 代码如下: private Image cropTransparency(Image image) { Bitmap imageCrop = new Bitmap(image); imageCrop.Save
我有这样的图像: 我写了一个代码,该代码应该只裁剪带有黑点的部分
(该代码只针对单色图像构建),
没有圆点周围的所有透明像素,
然后在裁剪后返回图像,
但由于某种原因,当它变成黑色像素时,
它无法识别这是黑色像素,
因此,它跳过了“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;
}
private Image cropTransparency(图像)
{
位图图像裁剪=新位图(图像);
保存(@“C:\Users\Nehoray\Desktop\Test.png”);
最小点=新点(imageCrop.Width、imageCrop.Height);
最大点=新点(imageCrop.Width、imageCrop.Height);
对于(int w=0;w最大X)
{
最大X=w;
}
如果(h>最大Y)
{
最大Y=h;
}
}
}
}
imageCrop=新位图(最大X-最小X,最大Y-最小Y);
Graphics g=Graphics.FromImage(imageCrop);
矩形cropRect=新矩形(新点(0,0),新尺寸(最大X-最小X,最大Y-最小Y));
g、 DrawImage(图像,新矩形(0,0,max.X-min.X,max.Y-min.Y),cropRect,GraphicsUnit.Pixel);
g、 Save();
回归作物;
}
如果您发现它无法识别黑色像素的原因,请告诉我。无论如何,谢谢:)这段代码有很多问题:
Point max = new Point(imageCrop.Width, imageCrop.Height);
当最大值初始化为最大值时,点如何大于最大值?这应该是(0,0)
我不确定这会不会像你想的那样。您有一个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();
这不会保存图像,你知道吗?您保存图像,在代码开始时不做任何修改,然后在裁剪后再也不保存它(我假设这些东西,包括硬编码的路径,是为了调试,但即使这样,您也可能打算在这里编写图像)您正在比较:(检查==Color.Black)
这意味着:参考检查是否指向与参考颜色相同的实例。黑色
-->这永远不会是真的
您必须比较实际颜色:
(check.ToArgb() == Color.Black.ToArgb())
祝您好运,单击所有消息框;)非常感谢你,你所有的建议都帮我解决了我的问题!现在一切正常:)只是增加了一个性能问题,我认为GetPixel不适合这种情况。你应该考虑和Bitmap.LockBits()合作以提高成绩。
(check.ToArgb() == Color.Black.ToArgb())