如何覆盖png的一部分?
How to overwrite part of a png?
给定一张 png 图像和一组要写入其中的数据,是否可以在特定感兴趣区域覆盖现有 png 中的像素?例如,如果我在像素 (0,0) (5,10) 之间的矩形中有一个数据块,是否可以将此数据作为一个块写入 10X10 png 而不必担心该区域不会被覆盖?我的用例是我有地图图块,其中一半数据在一个图块中,一半在另一个图块中,空白像素为白色方块。我想通过简单地将非白色像素直接写入块中的现有 png 来组合它们,而无需打开、组合然后重新写入整个 png。 png 的结构是否允许这样做?
我不愿意说这是不可能的,但这确实很复杂。
首先,PNG 的像素(有时)是 interlaced,因此您必须根据 Adam7 方案计算目标像素的位置。
此外,每一行都是独立的 filtered,因此您必须使用目标行的过滤器来转换源的每一行。根据过滤器,您还必须调整更新目标字节边界上的其他字节。马嘴直说:
Though the concept is simple, there are quite a few subtleties in the actual mechanics of filtering.
最后,所有过滤后的字节 compressed 使用称为 "deflate." 的通用压缩算法,除非您想事先解压缩整个内容,否则您需要确保 (1) 您的来源数据可以被正确解码,并且 (2) 目标字节边界附近的字节在它们的新邻居的上下文中被正确压缩。
我不是压缩专家,所以我不会详细争论。一个好消息是,由于其 sliding window 方案,该算法似乎保留了远距离区域之间的独立性:数据仅根据前面某个范围内的数据进行压缩,比如 13,000 字节。
如果您觉得这很容易,请尝试一下。不过,如果您像我一样,只需解码整个内容,将像素覆盖为位图数据,然后对结果进行编码。
这实际上是不可能的,因为像素数据(在逐行 "filtering" 之后)是用 ZLIB 压缩的。 更改压缩流的一部分。
给定一张 png 图像和一组要写入其中的数据,是否可以在特定感兴趣区域覆盖现有 png 中的像素?例如,如果我在像素 (0,0) (5,10) 之间的矩形中有一个数据块,是否可以将此数据作为一个块写入 10X10 png 而不必担心该区域不会被覆盖?我的用例是我有地图图块,其中一半数据在一个图块中,一半在另一个图块中,空白像素为白色方块。我想通过简单地将非白色像素直接写入块中的现有 png 来组合它们,而无需打开、组合然后重新写入整个 png。 png 的结构是否允许这样做?
我不愿意说这是不可能的,但这确实很复杂。
首先,PNG 的像素(有时)是 interlaced,因此您必须根据 Adam7 方案计算目标像素的位置。
此外,每一行都是独立的 filtered,因此您必须使用目标行的过滤器来转换源的每一行。根据过滤器,您还必须调整更新目标字节边界上的其他字节。马嘴直说:
Though the concept is simple, there are quite a few subtleties in the actual mechanics of filtering.
最后,所有过滤后的字节 compressed 使用称为 "deflate." 的通用压缩算法,除非您想事先解压缩整个内容,否则您需要确保 (1) 您的来源数据可以被正确解码,并且 (2) 目标字节边界附近的字节在它们的新邻居的上下文中被正确压缩。
我不是压缩专家,所以我不会详细争论。一个好消息是,由于其 sliding window 方案,该算法似乎保留了远距离区域之间的独立性:数据仅根据前面某个范围内的数据进行压缩,比如 13,000 字节。
如果您觉得这很容易,请尝试一下。不过,如果您像我一样,只需解码整个内容,将像素覆盖为位图数据,然后对结果进行编码。
这实际上是不可能的,因为像素数据(在逐行 "filtering" 之后)是用 ZLIB 压缩的。