如何将 rgb 图像数组从 sws_scale 转换为 DIB(在内存位图中)

Posted

技术标签:

【中文标题】如何将 rgb 图像数组从 sws_scale 转换为 DIB(在内存位图中)【英文标题】:How do I convert an rgb image array from sws_scale to DIB (in memory bitmap) 【发布时间】:2011-11-18 22:26:21 【问题描述】:

我正在从流中解码视频帧,sws_scale 为我提供了一个解码后的 RGB 图像数据 (PIX_FMT_RGB24) 的缓冲区。我有一个需要输入为 DIB 的现有前端应用程序。所以我需要知道如何将此缓冲区转换为 DIB?

据我了解,Windows 上的 DIB 是 BGR,从下到上,需要一个标题。我希望这个问题已经得到解决,而不是手动执行。我也想知道也许 sws_scale 可以在本地做到这一点。

【问题讨论】:

如果您决定自己动手,这里有大量关于位图格式的 DIB 标头的信息:en.wikipedia.org/wiki/… 【参考方案1】:

这不是您要寻找的答案。但是,这就是我所拥有的一切。

DIB 代表设备独立位图,它只是一个带有额外 (DIB) 标头的位图,指定有关图像数据的一些信息,以便多个设备/平台可以理解它。您可以轻松链接到免费的外部库(例如 DevIL)来生成位图,但我不知道有任何库会为您创建 DIB 标头。但是,wiki page 上有很多关于 DIB 标头的信息,看起来并不难自己做,让其他库(我建议 DevIL)来做图像转换。

我希望其他人想出一个很好的第三方库,可以完全满足您的要求。祝你好运!

【讨论】:

好的,所以我已将 sws_scale 的目标格式更改为“PIX_FMT_BGR24”以使像素颜色正确。然后我写了一个循环来反转行的顺序(自下而上)。我确认可以使用十六进制编辑器。现在我需要弄清楚那个 40 字节的 DIB 标头。我记得上次我看那个 wiki 页面时,它看起来并不简单。 好的,开始工作了。不知道这在 30fps 时会有多高的效率……但它就是这样。 你知道如何自己生成标题了吗?它有效吗?酷的东西。 33 毫秒应该是足够的时间来完成这一切。 为了测试它,我手动插入了位图标题(在 40 字节的 DIB 标题之上),以查看它是否可以在典型的图像查看器中查看并且它是否有效。至于33ms,我还不确定。我正在同一时间间隔内进行视频解码和 yuv 到 rgb 的转换。如果我结束了,我可能需要修改 sws_scale 源以直接从 yuv 转到 DIB。

以上是关于如何将 rgb 图像数组从 sws_scale 转换为 DIB(在内存位图中)的主要内容,如果未能解决你的问题,请参考以下文章

sws_scale YUV --> RGB 扭曲图像

将 AVFrame 转换为 RGB32 时在 sws_scale 处崩溃

ffmpeg sws_scale 上的分段错误

4.图像处理库libswscale的sws_getContext(),sws_scale(),avdevice_register_all(),gdigrab简记

matlab怎么将灰度图像转为rgb图像

如何将rgb 模式转换成 yuv 模式