【问题标题】:libPNG reading RGBA at X,Y directly bypassing the bufferlibPNG 在 X,Y 读取 RGBA 直接绕过缓冲区
【发布时间】:2019-08-15 01:29:26
【问题描述】:

我很难理解 libPNG。

我的意图是在我的自定义 for 循环中读取数据(BGRA) 我内存不足 - 因此我不想将整个图像读入Buffer 我想直接从 PNG 文件中对 PNG 缓冲区进行采样。

就像png_bgra ReadAt(Row, Column); - 是否可以使用 libPNG 来实现?

【问题讨论】:

  • libpng 有完整的 API 文档。当我必须能够阅读png 图像时,我通读了它的文档并能够完成我需要的工作。我没有您的特殊要求,我不记得libpng 是否提供这种增量的、动态的原始图像数据提取。但是,可以肯定地说,如果您在其文档中找不到它,它就不存在。因此,您需要简单地检查 libpng 的文档并自己弄清楚。知道在哪里可以找到以及如何阅读技术文档是每个 C++ 开发人员的必备技能。
  • @SamVarshavchik 好吧,我确实读过它,但老实说,我很难理解这种语言,据我所知,它有很多用例等,但我找不到具体的东西: (,我想也许我错过或误解了某些东西,也许有些人已经遇到过它
  • libpng 也是一个带有 C API 的 C 库,但它可以与 C++ 一起使用。

标签: c++ libpng


【解决方案1】:

PNG 格式本身的设计使这成为不可能。

IDAT 块的内容(包含图像数据)使用 zlib 压缩,zlib 是一个流压缩器。如果不解压缩导致图像数据的所有数据,就无法解压缩部分图像数据;此外,解压缩该数据将需要高达 44 kB (cf. "Memory Footprint") 的临时缓冲区。

【讨论】:

  • 所以我们甚至不能解压缩,只能说一次一行?
  • 你可以,但这不是你问的。而且,根据图像的大小,zlib 临时缓冲区的内存使用量(跨行持续存在!)可能会抵消不一次解压缩整个图像所节省的内存。
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多