无法使用此程序绘制图像

本文关键字:程序 绘制 图像 | 更新日期: 2023-09-27 18:07:01

我正在尝试处理图像以找出其中的红色区域。我扫描像素,如果它们被发现是足够的红色,它们被转换为黑色,否则是白色。

为了加快这一过程,我跳过了某些像素,并且需要在它们的位置绘制黑色或白色块。我正在使用这个功能,但它似乎是错误的地方。我最后得到的图像是完全空白的。

    public void ProcessFrame( ref Bitmap image )
    {
        int skip = 10;
        Graphics g = Graphics.FromImage(System.Drawing.Image.FromHbitmap(image.GetHbitmap()));
        SolidBrush black = new SolidBrush(Color.Black);
        SolidBrush white = new SolidBrush(Color.White);
        for (int i = 0; i < image.Width; i=i+skip)
        {
            for (int j = 0; j < image.Height; j = j + skip)
            {
                Color cl = image.GetPixel(i, j);
                if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))
                {
                    g.FillRectangle(black, new Rectangle(i, j, skip, skip));
                }
                else
                {
                    g.FillRectangle(white, new Rectangle(i, j, skip, skip));
                }
            }
        }
   }

你能指出错误,或者其他更好的方法来实现我的目标吗?

无法使用此程序绘制图像

你说的空白是指白色吗?

我不知道你的图像,但if (cl.R > (cl.G * 2) && cl.R > (cl.B * 2))不是一个很好的红色测试。#010000通过了测试,但基本上是黑色的。#ffaaaa看起来是红色的,但不会通过。

如果你有一个非常暗的图像,很多像素可能通过测试,不是很红。对于浅色图像,大量红色像素无法通过。

可能最好的方法是将颜色转换为HSL,然后使用位于红色区域的H(ue)值,但只有当S(饱和度)和L(亮度)足够亮且非灰色(超过阈值而不仅仅是黑色或灰色)

尝试使用:

Graphics g = Graphics.FromImage(image);

然后考虑其他回复来改进你的颜色测试。

您没有显示创建image的位置,但是这段代码将绘制成位图:

var bmp = new Bitmap(200,200);
using (g = Graphics.FromImage(bmp))
{
    g.FillEllipse(Brushes.Red, 10, 10, 50, 50);
}

注意,在使用图像之前需要调用Graphics.Dispose(或使用using)。

还请注意,使用GetPixel进行图像处理将非常慢。使用低级内存访问(Bitmap.LockBits)或尝试一些。net的图像处理库(如AForge)。