2011-09-07 58 views
2

我正在构建一个应用程序,该程序在用户在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的例子可以再现非常清晰的剧照,而且它的表现让我能够以更快的速度拍摄。我怀疑我只需要实现这两个方面,并做我自己的基准测试,以充分满足我的好奇心。

回答

3

如果您有权访问PNG压缩实施,那么您可以轻松优化压缩,而不必像前一个预处理“下一张”图像那样使用MNG格式。如果屏幕截图变化不大,这种方法很幼稚但有效,而“几乎空”的PNG压缩将大大减少所需的存储空间。

+0

这是很好的见解。我开始阅读MNG文档,并注意到他们有一个叫做“Delta-PNG”的东西,就像听起来一样。从概念上讲这很简单(这很棒),并且确实解决了这些问题。如果没有人提供有关视频流的有趣信息,我会接受此答案。 –