【问题标题】:Red, Green and Blue value arrays to color bitmap红色、绿色和蓝色值数组为位图着色
【发布时间】:2015-06-28 16:25:38
【问题描述】:

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

但我不完全理解这是如何工作的。我读过一些关于填充数据等的内容。有人知道快速完成这项工作的方法吗?

【问题讨论】:

  • 查看here 了解使用锁定位的示例。

标签: c# arrays bitmap rgb


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

【讨论】:

  • 我在示例中使用的 SetPixel 实际上是链接中 LockBitmap 类的函数 - 它与 Bitmap.SetPixel 完全不同,它只是具有相同的名称!
  • 啊,有趣。所以它是直接设置频道的替代方法。 (顺便说一句,头像不错 ;-) - 我不认为分工是个好主意!
  • 这很有魅力,非常感谢!我之前的代码使用 250 毫秒来存储 800x500 的图片,现在它只使用了大约 50 毫秒。 @TaW 为什么你认为这个部门是个坏主意?我认为这是一种为 x 和 y 位置获取正确索引的简单方法。
  • 通常的方法是使用双循环,其中只有添加。但是(到目前为止)比整数除法更大的收益是使用 lockbits..
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 2016-01-01
  • 2018-09-15
相关资源
最近更新 更多