适当的图像文件格式,用于无损压缩一系列屏幕截图

时间:2011-09-07 18:58:39

标签: c++ image video image-processing compression

我正在构建一个应用程序,它在用户在Windows桌面上执行“录制”操作的过程中需要大量的屏幕截图。

出于显而易见的原因,我希望以尽可能有效的方式存储这些数据。

起初我想过使用PNG格式来完成这项工作。但我偶然发现了这个问题:http://www.olegkikin.com/png_optimizers/

最佳算法仅对GUI图标的图像进行了3到5%的改进。这是非常令人沮丧的,并且表明我将需要做得更好,因为仅使用PNG将不允许我使用先前的帧来帮助压缩比。文件大小将继续随时间线性增长。

我想通过一些黑客来解决这个问题:只需将帧保存在一些数字的组中,并排。例如,我可以将10个1280x1024捕获的内容存储在单个1280x10240图像中,然后压缩应该能够利用相邻图像的重复。

但问题是用于压缩PNG的算法不是为此而设计的。我是以1024像素的间隔任意放置图像,每次只能将10个图像组合在一起。根据我在扫描PNG规范几分钟后收集到的信息,压缩操作在各个扫描线上(经过滤波)然后再组合在一起,因此实际上无法从下方引用上面1024像素的信息。

所以我找到了扩展PNG以允许动画的MNG格式。这更适合我正在做的事情。

我担心的一件事是有多少支持用新帧“扩展”图像/动画。我的应用程序中数据生成的本质是新帧会定期添加到列表中。但我对这个问题有一个简单的半解决方案,即缓存一大堆最近生成的数据,并逐步产生一个“动画”,比如每10帧。这将允许我在RAM中仅占用10帧的未压缩图像数据,不如立即将其卸载到文件系统,但这并不可怕。在整个过程完成之后(或者甚至在自由线程中使用自由循环,在执行期间)我可以轻松地返回并将10个组合在一起,如果它甚至值得付出努力。

这是我的实际问题,一切都在导致。 MNG是我的要求的最佳格式吗?这些要求是:1。C / C ++实现可用许可许可,2。24/32位颜色,4 +百万像素(一些人运行30英寸显示器)分辨率,3。无损或近无损(保持文本清晰度)压缩有条款参考以前的框架,以帮助压缩。

例如,这是我想到的另一个选项:视频编解码器。我想要无损质量,但我已经看到了h.264 / x264再现非常清晰的静止图像的例子,它的性能使得我可以以更快的速度捕获。我怀疑我只需要实现这两个并做我自己的基准测试以充分满足我的好奇心。

1 个答案:

答案 0 :(得分:3)

如果您可以访问PNG压缩实现,则可以轻松优化压缩,而无需使用MNG格式,只需将“下一个”图像预处理与前一个图像不同即可。如果屏幕截图没有太大变化,这是天真但有效的,压缩“几乎空”的PNG将减少所需的存储空间。