0


我有这张图片:

在此处输入图像描述

我编写了一个代码,该代码应该只裁剪带有黑点的部分
(该代码仅适用于单色图像),
没有点周围的所有透明像素,
然后在裁剪后返回图像,
但是对于出于某种原因,当它到达一个黑色像素时,
它无法识别这是一个黑色像素,
因此,它会跳过“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;
    }

如果您发现为什么当有黑色像素时它无法识别,请告诉我..
无论如何谢谢 :)

4

2 回答 2

2

这段代码有很多问题:

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

这不会保存图像,你知道吗?您保存图像,在代码开始时未修改,然后在裁剪后永远不会重新保存它(我假设这些东西,包括硬编码的路径,是用于调试的,但即便如此,您似乎也可能意思是在这里写图像)

于 2013-01-19T11:55:19.410 回答
0

您正在比较:(check == Color.Black)这意味着:引用是否check指向与引用相同的实例Color.Black-> 这永远不会是真的。

你必须比较实际的颜色:

(check.ToArgb() == Color.Black.ToArgb())
于 2013-01-19T11:58:12.677 回答