【问题标题】:How to overwrite part of a png?如何覆盖png的一部分?
【发布时间】:2017-08-04 06:35:47
【问题描述】:

给定一张 png 图像和一组要写入其中的数据,是否可以覆盖特定感兴趣区域中现有 png 中的像素?例如,如果我在像素 (0,0) (5,10) 之间的矩形中有一个数据块,是否可以将此数据作为一个块写入 10X10 png,而不用担心该区域不会被覆盖?我的用例是我有地图图块,其中一半数据在一个图块中,一半在另一个图块中,空白像素是白色方块。我想通过简单地将非白色像素直接写入块中的现有 png 来组合它们,而无需打开、组合然后重新写入整个 png。 png 的结构是否允许这样做?

【问题讨论】:

    标签: png


    【解决方案1】:

    我不愿声称这是不可能的,但这确实很复杂。

    首先,PNG 的像素(有时)是interlaced,因此您必须根据 Adam7 方案计算目标像素的位置。

    此外,每一行都是独立的filtered,因此您必须使用目标行的过滤器来转换源的每一行。根据过滤器,您还必须调整更新目标字节边界上的其他字节。直接从马嘴里:

    虽然概念很简单,但在过滤的实际机制中有不少细微之处。

    最后,所有过滤后的字节都是compressed,使用了一种称为“deflate”的通用压缩算法。除非您想事先解压缩整个内容,否则您需要确保 (1) 您的源数据可以正确解码,以及 (2) 目标字节边界附近的字节在其新邻居的上下文中正确压缩.

    我不是压缩专家,所以我不会更详细地争论。一个好消息是,由于其sliding window 方案,该算法似乎保留了遥远区域之间的独立性:数据仅基于某个先前范围内的数据进行压缩,例如 13,000 字节。

    如果您觉得这很容易,请尝试一下。不过,如果您像我一样,只需解码整个内容,将像素覆盖为位图数据,然后对结果进行编码。

    【讨论】:

    • 谢谢。我只是想知道这是否会节省时间。看起来很复杂。
    • "PNG 的像素是交错的"它们可以是,但通常不是。
    【解决方案2】:

    这实际上是不可能的,因为像素数据(在逐行“过滤”之后)是用 ZLIB 压缩的。 practically impossible 更改压缩流的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多