红色、绿色和蓝色值数组到彩色位图

本文关键字:数组 彩色 位图 蓝色 红色 | 更新日期: 2023-09-27 18:00:16

我正在尝试从单独的红色、绿色和蓝色数组创建一个位图,以便以后可以使用此位图为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开始到宽度、高度结束的颜色值(0到255)。但是,此代码相当慢。我更喜欢直接从数据中生成位图,但我不确定如何生成。我四处搜寻,发现了一些东西:

Bitmap bm_Image = new Bitmap(Width, Height, Stride, PixelFormat.Format24bppRgb, ipPtrRGB);

但我不完全理解这是怎么回事。我读过一些关于填充数据等的文章。有人知道这样快速的方法吗?

红色、绿色和蓝色值数组到彩色位图

如果你想更快地使用位图,我建议使用这个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函数。上面的链接甚至有一个基准测试,你可以运行它来看看它有多快