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())