【问题标题】:Iterative writing with PyPNG使用 PyPNG 进行迭代编写
【发布时间】:2014-12-18 12:48:06
【问题描述】:

我想知道是否有一种方法可以使用 PyPNG(如逐行或逐块)迭代地编写 png 文件,而不向 png.Writer() 提供整个数据。我查看了文档,但所有编写器方法都需要一次 PNG 的所有行(使用太多内存)。

提前致谢!

【问题讨论】:

  • 这可能是个问题,因为 PNG 需要整个图像压缩。所以在压缩之前,pypng 需要整个图像。它可能仍然是可能的,但仅限于对“可能”的足够广泛的解释;您可能需要从头开始编写自定义压缩代码。
  • @jongware,也许 pypng 需要整个图像,但这并不是因为 PNG 格式本身的缺点,它被设计为可流式传输。 libpng支持PNG文件的增量读写,zlib支持增量压缩。实际上,libpng 附带的 pngtest.c 演示了一次读取和写入图像,每行使用相同的行缓冲存储器。 pypng docs pythonhosted.org/pypng/png.html 似乎表明在编写“隔行扫描”PNG 输出时,整个图像只需要在内存中。
  • @GlennRanders-Pehrson 我已经尝试使用 PyPNG,但文档不清楚使用哪种编写器方法(我尝试了所有方法)。不过,我肯定会看看 libpng。感谢您的建议。
  • @Jongware:我用Java 做了这个(我需要这个),后来把它移植到C#。原则上当然可以,除了隔行扫描的 PNG。
  • 太棒了——我不知道这是libpng 中的一个选项!那么剩下的唯一问题就是:这个函数暴露给pypng了吗?浏览其来源,我找不到合理的名称。

标签: python png pypng


【解决方案1】:

如果你提供了一个迭代器,那么 PyPNG 将使用它。完整示例:

#!/usr/bin/env python

import random

import png

def iter_rows():
    H = 4096
    for i in xrange(H):
        yield [random.randrange(i+1) for _ in range(4096)]


img = png.from_array(iter_rows(), mode="L;12",
                     info=dict(size=(4096,4096)))
img.save("big.png")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多