【问题标题】:Best way to reverse bitmap data that is upside down反转颠倒位图数据的最佳方法
【发布时间】:2011-01-30 05:52:23
【问题描述】:

我有一个我调用的方法,它从捕获设备返回位图数据。

它以 IntPtr 形式返回指向缓冲区数据的指针,以 int 形式返回缓冲区长度。

我提前知道这个位图是 24bpp 和它的宽度和高度。

问题是缓冲区包含颠倒的位图数据,我需要这些数据的顺序正确(颠倒它)。

我所做的是创建一个 for 循环并使用 CopyMemory,我将此数据的每一行(步幅)从下向上复制到新分配的内存空间。

有什么方法可以比每次收到新帧时创建更多内存更快?由于每个位图都很大,它会使应用程序变得有点慢并消耗更多的内存。

我这样做是因为我使用了另一个分析位图的组件,如果位图倒置,它就无法正常工作。

我正在使用 .net、c# 谢谢!

【问题讨论】:

  • 位图如何使用?你把它画到屏幕上?有些 API 可以让您将位图声明为倒置,这样硬件将负责以更快的方式绘制位图。

标签: c# bitmap


【解决方案1】:

如果你有 System.Graphics.Bitmap 类的实例,你可以使用 RotateFlip(RotateFlipType.RotateNoneFlipY) - 但即使你从指向缓冲区数据的指针创建了 Bitmap,也可以用提到的来翻转它方法并将指针传递给其他地方的位图数据,我认为这会比你的方法慢。

但是你不能只将第一行与最后一行、(first+1) 与 (last-1) 等交换,而不分配新内存吗?

【讨论】:

    【解决方案2】:

    为什么不直接将指针移到末尾,然后反向处理数据。

    【讨论】:

    • 我可以这样做,就像我说的那样,我使用了另一个组件,它期望数据以正确的顺序......
    【解决方案3】:

    位图倒置存储在内存中是正常的,然后它将具有负步幅值。

    如果你使用的组件不能处理这个问题,你别无他法,只能为它转动图像。为了减少内存分配,您当然可以分配一次目标位图,然后为每一帧重复使用它。

    【讨论】:

      猜你喜欢
      • 2017-04-29
      • 2012-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多