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

标签 c# parallel-processing

有效填充位图类中每个字节代表一个像素(黑色或白色:< 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);

关于c# - 从 Bitmap 类的颜色填充 160x43 字节数组的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7574776/

相关文章:

c# - 从 OnActionExecutionAsync 返回而不在 asp.net 核心中执行操作

c# - 在单独的 dll WPF 中设置资源

python - 如何从 multiprocessing.Pool.map 的worker_funtion内部为数组赋值?

同时在多个操作系统上进行测试

c# - 我如何使用默认构造函数创建我的类的数组?

c# - Cors 请求和 MVC5

c# - DataGridView 的魔力

c# - 并行下载大量文件的有效方法

java - 在REPL中的Scala中具有java.util.concurrent._的死锁

android - Android多线程: What Can & Should Be Run in Parallel?