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