将24位BGR图像从内存加载到ID2D1Bitmap1的最佳方法

迈克尔·格普施泰因

我在内存中有一个BGR 24位图像作为连续缓冲区(用表示cv::Mat,如果有帮助的话)。我想将其加载ID2D1Bitmap1到位图以进行2D渲染。我有以下工作代码(在此处显示伪代码):

IWICImagingFactory::CreateBitmapFromMemory(GUID_WICPixelFormat24bppBGR);
IWICFormatConverter::Initialize(GUID_WICPixelFormat32bppRGB);
ID2D1DeviceContext::CreateBitmapFromWicBitmap;

效果很好,主要的问题是时间:20-40毫秒,对于我的应用程序来说太长了。我正在寻找优化过程的方法。

ID2D1Bitmap1通过执行一次,然后使用可以从内存中加载转换后的图像,我大概可以节省的创建时间CopyFromMemory,但是转换本身仍需要大量时间。一种方法是将原始BGR缓冲区加载到GPU内存,然后在GPU本身上将其转换为本机RGBA格式,但是我不知道如何开始。

杰夫

您的第二个想法正是您应该走的方向。ID2D1Bitmap一次创建一个(多个),转换缓冲区(在下面进行更多介绍),然后使用CopyFromMemory我在一个应用程序中做了非常相似的事情,该应用程序提供了已连接网络摄像头(可能具有多种格式之一)的预览。某些相机会以MJPEG,YUY2等格式传送图像。

该应用使用MediaFoundationIMFTransform来转换缓冲区。IMFTransform这种情况下是的一个实例CLSID_CColorConvertDMO(其使用SIMD寄存器/指令如果可能)。然而,之前完成的是,我与自己的转换代码(这是CPU的约束,并进行马马虎虎),并与另一溶液测试HLSLDirectCompute(表现良好,但只能处理一种格式)。最后,我选择CLSID_CColorConvertDMO处理各种类型的输入,但是如果您只有一种已知类型,则可以选择使用HLSL解决方案(尽管这将导致您必须编写转换代码,并设置输入的“视图”数据)。

但是,如果您选择MediaFoundation路线,则可以不使用IMFTransform图表的所有其余部分(源,汇等)。创建CLSID_CColorConvertDMO实例并设置输入和输出类型(格式,帧大小等)之后,创建IMFSample(使用MFCreateSample)和IMFMediaBuffer(使用MFCreateMemoryBuffer)到示例(使用IMFSample :: AddBuffer),然后进行所有操作必要的是调用ProcessInputProcessOutput转换缓冲区(先创建所有项目)。这听起来可能很多,但是如果操作正确,CPU使用率将不会受到明显影响,即使对于通常以60 FPS以上的速度提供大型帧的采集卡(使用了DataPath的采集卡),您也将获得所需的性能。和过去的Blackmagic采集卡)。

祝你好运。我敢肯定你会喜欢的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ID2D1Bitmap1 :: Map问题

来自分类Dev

如何在C ++中将内存中加载的图像文件转换为ID2D1Bitmap

来自分类Dev

将图像加载到滑块的最佳方法

来自分类Dev

从 .bmp 文件加载 ID2D1Bitmap

来自分类Dev

将图像加载到 android 的最佳方式

来自分类Dev

GameBoy将16位加载到8位内存中

来自分类Dev

从大型CSV文件读取而不用Java将所有内容加载到内存的最佳方法

来自分类Dev

Android:将按比例缩小的图像加载到内存中

来自分类Dev

MATLAB:将3通道24位bmp图像转换为1通道16位bmp图像

来自分类Dev

正确地将24位位图数据加载到32位位图对象中

来自分类Dev

异步将图像加载到导航弹出窗口或最佳方式来加载图像

来自分类Dev

将页面数据加载到div中的最佳方法

来自分类Dev

有没有一种方法可以将通过http下载的图像直接加载到内存中?

来自分类Dev

将ID2D1Effect输出存储在ID2D1Bitmap / Image中以在以后绘制它吗?

来自分类Dev

将图像加载到JPanel

来自分类Dev

将图像加载到FileReader

来自分类Dev

将图像加载到ExifInterface

来自分类Dev

C#,循环遍历NHibernate对象而不将整个集合加载到内存的最佳方法

来自分类Dev

如何将结构显式加载到L1d缓存中?

来自分类Dev

将tensorflow 1.xx模型加载到tensorflow 2.xx中

来自分类Dev

将URL从Activity1加载到包含Web视图的Activity2

来自分类Dev

将图像从BGR更改为二进制图像0,1?

来自分类Dev

OpenGL ES2.0将8位图像加载到模板缓冲区中

来自分类Dev

OpenGL ES2.0将8位图像加载到模板缓冲区中

来自分类Dev

在后台将图像加载到列表视图时出现“内存不足”错误

来自分类Dev

将PDF从内存加载到telerik:RadPdfViewer

来自分类Dev

django何时将数据加载到内存?

来自分类Dev

将PDF从内存加载到telerik:RadPdfViewer

来自分类Dev

Direct2D:如何将ID2D1RenderTarget的内容保存到图像文件?

Related 相关文章

  1. 1

    ID2D1Bitmap1 :: Map问题

  2. 2

    如何在C ++中将内存中加载的图像文件转换为ID2D1Bitmap

  3. 3

    将图像加载到滑块的最佳方法

  4. 4

    从 .bmp 文件加载 ID2D1Bitmap

  5. 5

    将图像加载到 android 的最佳方式

  6. 6

    GameBoy将16位加载到8位内存中

  7. 7

    从大型CSV文件读取而不用Java将所有内容加载到内存的最佳方法

  8. 8

    Android:将按比例缩小的图像加载到内存中

  9. 9

    MATLAB:将3通道24位bmp图像转换为1通道16位bmp图像

  10. 10

    正确地将24位位图数据加载到32位位图对象中

  11. 11

    异步将图像加载到导航弹出窗口或最佳方式来加载图像

  12. 12

    将页面数据加载到div中的最佳方法

  13. 13

    有没有一种方法可以将通过http下载的图像直接加载到内存中?

  14. 14

    将ID2D1Effect输出存储在ID2D1Bitmap / Image中以在以后绘制它吗?

  15. 15

    将图像加载到JPanel

  16. 16

    将图像加载到FileReader

  17. 17

    将图像加载到ExifInterface

  18. 18

    C#,循环遍历NHibernate对象而不将整个集合加载到内存的最佳方法

  19. 19

    如何将结构显式加载到L1d缓存中?

  20. 20

    将tensorflow 1.xx模型加载到tensorflow 2.xx中

  21. 21

    将URL从Activity1加载到包含Web视图的Activity2

  22. 22

    将图像从BGR更改为二进制图像0,1?

  23. 23

    OpenGL ES2.0将8位图像加载到模板缓冲区中

  24. 24

    OpenGL ES2.0将8位图像加载到模板缓冲区中

  25. 25

    在后台将图像加载到列表视图时出现“内存不足”错误

  26. 26

    将PDF从内存加载到telerik:RadPdfViewer

  27. 27

    django何时将数据加载到内存?

  28. 28

    将PDF从内存加载到telerik:RadPdfViewer

  29. 29

    Direct2D:如何将ID2D1RenderTarget的内容保存到图像文件?

热门标签

归档