位图.GetPixel()返回错误值。

4

我正在生成一个位图,并且在读取像素值时遇到了一些问题。我首先使用以下代码在我的类中生成一个名为maskBitmap的位图:

    void generateMaskBitmap()
    {
        if (inputBitmap != null)
        {
            Bitmap tempBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(tempBitmap))
            {
                Brush brush = Brushes.Black;
                for (int y = 0; y < tempBitmap.Height; y += circleSpacing)
                {
                    for (int x = 0; x < tempBitmap.Width; x += circleSpacing)
                    {
                        g.FillEllipse(brush, x, y, circleDiameter, circleDiameter);
                    }
                }
                g.Flush();
            }

            maskBitmap = (Bitmap)tempBitmap.Clone();
        }
    }

接下来我尝试使用以下代码将遮罩应用于原始图像:

    void generateOutputBitmap()
    {
        if (inputBitmap != null && maskBitmap != null)
        {
            Bitmap tempBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height);
            for (int y = 0; y < tempBitmap.Height; y++)
            {
                for (int x = 0; x < tempBitmap.Width; x++)
                {
                    Color tempColor = maskBitmap.GetPixel(x, y);

                    if (tempColor == Color.Black)
                    {
                        tempBitmap.SetPixel(x, y, inputBitmap.GetPixel(x, y));
                    }
                    else
                    {
                        tempBitmap.SetPixel(x, y, Color.White);
                    }
                }
            }
            outputBitmap = tempBitmap;
        }
    }

口罩位图已经成功地生成并在图片框中显示,但是在测试“tempColor”时,每个像素的颜色值都显示为空(A = 0,R = 0,G = 0,B = 0)。我知道使用getpixel/setpixel存在性能问题,但这对于这个项目不是问题。我也知道"“tempColor == Color.Black”不是一个有效的测试,但那只是我比较代码的占位符。


当你说,“遮罩位图已成功生成并可见”,显然你会看到一些黑点的模式。但是背景颜色是什么?它只是默认的图片框颜色吗?在我看来,你没有设置遮罩的背景,所以这些值未初始化,并报告0,0,0。要么先用另一种颜色填充图像,要么只需更改遮罩颜色即可避免这种情况。 - Scott Mermelstein
如果这是问题,你所画的和你没有绘制的区别在于,你所绘制的应该具有 100% 的 alpha 值,而你未初始化的部分应该具有 0% 的 alpha 值。 - Scott Mermelstein
1个回答

2

我无法重现您的问题。我复制并粘贴了您的代码,并进行了一些修改以使其在我的设备上运行。我可以确认tempColor有时为#FF000000。

我怀疑您在引用位图时混淆了一些内容。您确定您没有得到除#00000000之外的任何值吗?您的circleDiametercircleSpacing的值是否合理?最重要的是:您确定您正在从正确的位图中读取吗?

这是我已知能够正常工作的代码版本:

using System;
using System.Drawing;

namespace Test
{
    class Program
    {
        static void Main()
        {
            var bitmap = GenerateMaskBitmap(100, 100);
            TestMaskBitmap(bitmap);
        }

        const int CircleDiameter = 10;
        const int CircleSpacing = 10;

        static Bitmap GenerateMaskBitmap(int width, int height)
        {
            Bitmap maskBitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(maskBitmap))
            {
                Brush brush = Brushes.Black;
                for (int y = 0; y < maskBitmap.Height; y += CircleSpacing)
                {
                    for (int x = 0; x < maskBitmap.Width; x += CircleSpacing)
                    {
                        g.FillEllipse(brush, x, y, CircleDiameter, CircleDiameter);
                    }
                }
                g.Flush();
            }

            return maskBitmap;
        }

        static void TestMaskBitmap(Bitmap maskBitmap)
        {
            for (int y = 0; y < maskBitmap.Height; y++)
            {
                for (int x = 0; x < maskBitmap.Width; x++)
                {
                    Color tempColor = maskBitmap.GetPixel(x, y);

                    if (tempColor.ToArgb() != 0)
                        throw new Exception("It works!");
                }
            }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接