【问题标题】:Inplace conversion of 24bpp bitmap to 32bpp将 24bpp 位图就地转换为 32bpp
【发布时间】:2009-08-19 16:42:38
【问题描述】:

在 Delphi 7 中,我必须处理相当大的 24bpp 位图(几个 100 MB)。由于我想使用 Graphcis32 库进行进一步处理,因此必须将它们转换为 32bpp (TBitmap32)。然而,TBitmap32 的 LoadFromFile 方法会创建一个临时的常规 TBitmap 来加载原始 24bpp 位图,然后将其分配给 TBitmap32 以进行所需的格式转换。当然,通过在内存中放置两个这样的巨大位图,内存负载大约会增加一倍,这对我的应用程序来说可能是致命的。

我在想的是一种将 24bpp 位图加载到预分配缓冲区中的方法,该缓冲区的尺寸使得 32 bpp 位图适合。然后,从缓冲区端开始,我想将 RGB 字节移动到偏移量需要 32bpp。

这可能吗?如何将位图加载到预分配的缓冲区中?有什么想法吗?

【问题讨论】:

  • 您能否解释一下为什么这对您的应用程序可能是致命的?一点点内存分页可能会显示一点性能下降,但为什么会致命?
  • @Ken:他想避开副本。只分配一次大缓冲区,将(较小的)24bpp 位图读入缓冲区并就地进行所有转换。

标签: delphi bitmap graphics32


【解决方案1】:

我不太了解 Graphics32 的工作原理。但是,如果您使用标准文件格式并且可以直接访问 TBitmap32 像素数据,您应该能够创建自己的图像加载器,以便在没有其他方法的情况下一次性完成加载和向上转换到 32bpp 的格式。

常用文件格式的规范满网都是,你用的是哪一种?

【讨论】:

  • 你说得对,这会奏效。然而,这个解决方案并不完全符合我的预期(也许我的描述不够清楚......)我的输入文件通常是 24bpp Windows BMP 文件,但我不能排除其他 BMP 变体,例如压缩文件。在这种情况下,我必须自己完成所有解码等工作。是否有任何 API 函数允许将 BMP 读取到预分配的缓冲区中,以便像素矩阵已经可用?
猜你喜欢
  • 2013-02-25
  • 2014-03-17
  • 2023-03-14
  • 2011-09-15
  • 2021-12-13
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-09
相关资源
最近更新 更多