概述
我希望尽可能快地写入一个 .png 文件,不考虑压缩。也就是说,我不太关心文件大小,但我确实关心尽可能快地进行写入。
动机
我正在使用 OpenLayers(客户端)和 python/C++(后端)创建基于 Web 的地图应用程序。该应用程序需要能够快速绘制动态内容,以便用户在地图上移动时能立即看到更新。我已经制作了基于瓦片的(256x256 像素)和单图像的("单个瓦片")版本,但无论是哪种情况,后端渲染最慢的部分都是将图像保存为 png 文件(无论是在磁盘上还是在内存中)。例如,我可以在大约 200 毫秒内生成某个视图的“原始”、“tga”或“tiff”版本,但生成 .png 版本需要更长的时间,因为 .png 保存几乎需要整整一秒钟,而保存其他格式的时间少于 100 毫秒(即使“原始”文件的大小是 .png 文件的五倍以上)。而这个文件保存时间也显着大于将结果图像从服务器传输到客户端的时间。(我的应用程序的一个重要属性是,“后端”通常会在与浏览器相同的计算机上运行,因此即使对于较大的文件,传输时间也可以忽略不计。)
我认为通过调用 C++ 中的 libpng 库,可以快速地对 .png 进行写入:
png_set_compression_level( png_ptr, 0 );
在调用任何png_write_...
函数之前,请确保先调用png_set_compression_level(png_structp,int)
。然而,虽然这个调用确实停止了libpng对文件的压缩(生成的文件大小与.raw文件大致相同),但它并没有使得保存.png文件明显更快。
请帮帮我
我需要将这些图像使用.png格式,因为我需要它们作为透明覆盖层放置在基础地图上,并且需要比GIF提供的256种颜色更多。OpenLayers只是使用html的img标签,因此我的理解是我只能使用有效的img格式。
我认为应该有一种方法可以通过不进行任何真正的压缩来快速编写.png文件(我知道.png“总是被压缩”,但我想象这可能包括“空压缩”)。看起来你应该能够编写一个简单的固定头部,后跟未压缩的数据,再跟一些固定的页脚。或者按行执行同样的想法。重点是我可以非常快地在C++中循环遍历这2.5 MB的原始数据,并且可以非常快地将其转储到各种文件格式中,因此似乎我也应该能够快速转储为固定的未压缩的.png格式。
听起来对吗?你知道我可以在哪里找到执行此操作的代码示例吗?