Skip to main content
 首页 » 编程设计

c#之从 Bitmap 类的颜色填充 160x43 字节数组的更快方法

2024年02月03日3198°冷暖

有效填充位图类中每个字节代表一个像素(黑色或白色:< 125 = 黑色,> 125 = 白色)的字节数组的更快方法是什么?

我将其用于彩色图像:Better/faster way to fill a big array in C#

但是现在我正在寻找不同的东西(我什至可以使用像红色这样的单一颜色来填充它,没关系只是我应该选择的东西),因为数组格式发生了变化。

有什么建议吗?实际上我正在使用这段代码,这显然不是最好的主意

        for (int x = 0; x < LgLcd.NativeConstants.LGLCD_BMP_WIDTH; ++x) 
        { 
            for (int y = 0; y < LgLcd.NativeConstants.LGLCD_BMP_HEIGHT; ++y) 
            { 
                tmp = bmp.GetPixel(x, y); 
                array[y * LgLcd.NativeConstants.LGLCD_BMP_WIDTH + x] = (byte)((tmp.R == 255 && tmp.G == 255 && tmp.B == 255) ? 0 : 255); 
                //array[y * x] = (byte)0; 
            } 
        } 

我的想法是将所有内容并行化(是的,也许每行 1 个线程?(或每列)),我认为这应该有所帮助。

编辑:

好的,首先,我需要一种方法可以同时访问图像的不同字节,Brandon Moretz 建议使用锁位访问字节的正确方法。但是,我想避免不安全的代码。 Lockbits 是否必然涉及不安全代码?

其次,我的并行化想法是使用 Parallel.For。此方法应使用 ThreadPool 类,该类将使用不超过 cpu 核心数的线程数,并且它们是预先分配的。

这个方法会被调用很多次,所以我觉得问题不大,因为线程池在第一次调用后会用到很多。

我说的对吗?

请您参考如下方法:

使用“不安全”代码块是一种选择吗?您可以使用 LockBits在位图上得到它的 BitmapData ,然后使用 Scan0 和 Stride 属性对其进行迭代。

如果它是 255 种颜色,我假设每个像素一个字节,所以像这样:

*( ( ( byte* )bmpData.Scan0 ) + ( y * bmpData.Stride ) + x ) = (byte)((tmp.R == 255 && tmp.G == 255 && tmp.B == 255) ? 0 : 255);