红色,绿色和蓝色值数组以着色位图

时间:2015-06-28 16:25:39

标签: c# arrays bitmap rgb

我正在尝试从单独的红色,绿色和蓝色数组创建位图,以便稍后我可以使用此位图为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);

但我不完全明白这是如何运作的。我已经阅读了有关填充数据等的内容。有人知道一种快速执行此操作的方法吗?

1 个答案:

答案 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函数快得多。上面的链接甚至有一个基准测试,你可以运行它来查看它的速度。