概括
我想尽快写一个 .png 文件,而不用担心压缩。也就是说,我不太关心文件大小,但我确实关心写操作是否发生得越快越好。
动机
我正在使用客户端的 OpenLayers 和后端的 python/C++ 制作基于 Web 的地图应用程序。当用户在地图上移动时,应用程序需要能够快速绘制动态内容。我有基于瓦片(256x256 瓦片)和基于单个图像(“单个瓦片”)的版本,但在这两种情况下,后端渲染的最慢部分实际上是将图像保存为 png 文件(无论是-磁盘或内存)。例如,我可能能够在大约 200 毫秒内生成某个视图的“raw”、“tga”或“tiff”版本,但生成 .png 版本需要 1.2 秒,因为 .png保存几乎需要一秒钟,而实际保存其他格式的时间为 100 毫秒或更短(即使“原始”文件的大小是 .png 文件的五倍)。而且这个文件保存时间也大大超过了将结果图像从服务器传输到客户端的时间。(我的应用程序的一个重要属性是,通常“后端”将与浏览器在同一台机器上运行,因此传输时间可以忽略不计,即使对于大文件也是如此。)
我想我可以通过调用使 .png 快速写入(当使用 C++ 中的 libpng 时)
png_set_compression_level( png_ptr, 0 );
在调用任何png_write_...
函数之前。然而,虽然该调用似乎确实阻止了 libpng 压缩文件(生成的文件与 .raw 文件的大小大致相同),但它并没有明显加快保存 .png 的速度。
请帮忙
我需要为这些图像使用 .png,因为我需要它们成为基本地图顶部的透明叠加层,而且我需要的不仅仅是 GIF 提供的 256 种颜色。OpenLayers 只是简单地使用 html img 标签,所以我的理解是我只能使用有效的 img 格式。
我认为有一种方法可以通过不进行任何实际压缩来快速编写 .png 文件(我知道 .png 是“始终压缩的”,但我想这可能包括“空压缩”)。看起来您应该能够编写一个简单的固定页眉,然后是未压缩的数据,然后是一些固定的页脚。或者也许是同样的想法,但是以逐行的方式。关键是我可以非常快速地在 C++ 内存中对这 2.5 MB 的原始数据进行各种循环,并且可以非常快速地将其转储为各种文件格式,所以看起来我应该能够以固定的方式转储它, 未压缩的 .png 格式也很快。
听起来对吗?你知道我在哪里可以找到这样做的代码示例吗?