我正在尝试从单独的红色,绿色和蓝色数组创建位图,以便稍后我可以使用此位图为avi文件(SharpAVI)创建一个帧。我尝试了以下有效的代码:
Bitmap Bmp = new Bitmap(Width, Height);
for (int ii = 0; ii < (Width*Height); ii++)
{
ypos = ii / Width;
xpos = ii % Width;
Bmp.SetPixel(xpos, ypos, Color.FromArgb(dataR[ii], dataG[ii], dataB[ii]));
}
数组dataR,dataG和dataB包含从0,0开始并以width,height结束的颜色的值(0到255)。但是,这段代码相当慢。我宁愿直接从数据中生成位图,但我不确定如何。我已经四处走动,发现了一些方向:
Bitmap bm_Image = new Bitmap(Width, Height, Stride, PixelFormat.Format24bppRgb, ipPtrRGB);
但我不完全明白这是如何运作的。我已经阅读了有关填充数据等的内容。有人知道一种快速执行此操作的方法吗?
答案 0 :(得分:1)
如果你想更快地使用位图,我建议使用这个LockBitmap类,在这里找到: http://www.codeproject.com/Tips/240428/Work-with-bitmap-faster-with-Csharp
实现相对简单,您可以使用目前使用的相同数据结构。这就是LockBitmap
实现对您的代码的影响:
Bitmap Bmp = new Bitmap(Width, Height);
LockBitmap lockBitmap = new LockBitmap(Bmp);
lockBitmap.LockBits();
for (int ii = 0; ii < (Width*Height); ii++)
{
ypos = ii / Width;
xpos = ii % Width;
lockBitmap.SetPixel(xpos, ypos, Color.FromArgb(dataR[ii], dataG[ii], dataB[ii]));
}
lockBitmap.UnlockBits();
Bmp.Save(filename)
我自己已经将这个类用于一些项目,我发现它比标准的.NET函数快得多。上面的链接甚至有一个基准测试,你可以运行它来查看它的速度。