给定一个png图像和一组要写入的数据,是否可以覆盖特定感兴趣区域中现有png中的像素?例如,如果我在像素(0,0)(5,10)之间的矩形中有一个数据块,那么可以将这个数据作为块写入10X10 png而不用担心没有被覆盖的区域吗?我的用例是我有地图图块,其中一半数据将在一个图块中,一半在另一个图块中,空白像素为白色正方形。我想通过简单地将非白色像素直接写入块中的现有png来组合它们,而无需打开,组合,然后重写整个png。 png的结构是否允许这样做?
答案 0 :(得分:1)
我不愿意声称这是不可能的,但它确实很复杂。
首先,PNG的像素(有时)interlaced,因此您必须根据Adam7方案计算目标像素的位置。
此外,每行独立filtered,因此您必须使用目标行的过滤器转换源的每一行。根据过滤器,您还必须在更新的目标字节的边界上调整其他字节。直接从马的嘴里出来:
虽然这个概念很简单,但实际的过滤机制还是有一些细微之处。
最后,所有过滤的字节都是compressed,使用称为“deflate”的通用压缩算法。除非你想事先解压缩整个事情,否则你需要确保(1)你的源数据能够被正确解码,以及(2)目标字节边界附近的字节在新邻居的上下文中被正确压缩
我不是压缩专家,所以我不会更详细地论证。一个好消息是,由于sliding window方案,该算法似乎保持了远程区域之间的独立性:数据仅基于某些先前范围内的数据进行压缩,比如13,000字节。
如果这对您来说很容易,请尝试一下。但是,如果你像我一样,你只需解码整个事物,将像素覆盖为位图数据,然后对结果进行编码。
答案 1 :(得分:0)
这实际上是不可能的,因为像素数据(在逐行“过滤”之后)用ZLIB压缩。并且practically impossible可以更改压缩流的一部分。