【问题标题】:Efficiency of Using PNG's vs. BMP's With Large Files在大文件中使用 PNG 与 BMP 的效率
【发布时间】:2012-04-05 16:53:42
【问题描述】:

我在 Delphi 中编写了一个映射程序,用户可以在后台加载我存储在内存中的光栅图像。在一种情况下,用户成功加载了 44MB BMP,但程序运行缓慢,当他们打印(我平铺输出)时,他们得到了资源不足错误。我将 BMP 转换为 PNG (3MB),程序执行得更好,打印作业成功。

既然 PNG 必须扩展为相同大小的 DIB,为什么会有性能/资源差异?如果有的话,加载 PNG 应该需要更多的工作和内存分配。我错过了什么?

由于似乎没有任何明显的答案,我将编写一个小型演示项目,以便进一步研究。

【问题讨论】:

  • 您确定 BMP 和 PNG 文件具有相同的像素数和 BitsPerPixel 吗?
  • 您使用什么来打印图像?您是直接在 Printer.Canvas 上书写,还是在 QuickReport 或 Rave 等报表上使用组件?
  • Francois:是的,我拿到了客户文件并亲自尝试过。 rkawano:我打印到我发送到打印机画布的 DIB 瓷砖。
  • 听起来你自己的某个地方有内存泄漏。

标签: delphi graphics png bmp


【解决方案1】:

区别在于压缩。

BMP = 原始数据 PNG = 使用“无损”压缩的相同原始数据

这在编程界节省了不止一种方式...

  1. 加载图像会导致将更少的原始数据加载到内存中。
  2. 这样您就可以处理更少的原始数据,因此您需要的资源也更少。

平铺意味着问题对你来说是指数级的......

44MB x 10 块 = 440MB

对比

3MB x 10 块 = 30MB

打印机不喜欢收到大量数据,除了更昂贵的打印机外,所有打印机都倾向于一次性打印整个文档(例如缓冲整个流)。

因此,用户从您的应用程序中说“打印”......然后您的代码说“对,我要发送 10 个副本”并且打印机开始“缓存”440MB 的原始数据。

大多数常见的家用打印机依靠电脑进行缓存并打印所提供的内容,但标准的办公室打印机将进行缓存然后打印文档。

但是...我认为这是您可以调整的可选内容(不过我认为它因打印机而异)。

编辑:

这里有一些来自游戏编程世界的东西:

http://www.gamedev.net/topic/450104-png-vs-bmp/

【讨论】:

  • 在跟踪代码时,PNG 被扩展为与内存中 BMP 大小相等的 DIB。我想内存效率更高的代码会根据需要进行转换。
  • 你是说平铺没有用吗?我以设备分辨率在磁贴上绘制一部分,然后将其传递给打印机。我会直接绘制并让打印机驱动程序处理它,但我会失去透明的能力。
  • 我不完全确定您在做什么,但基本概念是您发送到打印机的每个图像块都必须处理,并且通常必须将其作为未压缩的“原始”数据执行。这可能是您的资源问题的原因......打印机上的资源而不是计算机上的资源......这有意义吗?
  • 并非如此,无论原始图像是 PNG 还是 BMP,平铺都会发送相同数量的数据 (DIB)。事实上,这两个图像都由我在内存中用作设备独立位图 (DIB) 的库存储。这就是为什么整个问题毫无意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
相关资源
最近更新 更多