可以将高质量的JPEG转换为低质量的JPEG而无需解码吗?

时间:2013-08-15 08:28:57

标签: c image jpeg raspberry-pi

我有一个网络摄像头可以提供高质量的MJPEG。

我需要通过网络发送小型,低质量的JPEG。我的硬件是Raspberry Pi(700MHz ARM)。我希望代码使用尽可能少的CPU能力,并尽可能减少延迟。我可以解码并重新编码每个帧,但这可能是浪费...

在没有解码的情况下降低JPEG图像的质量在逻辑上是否可行?

即。我可以找到并删除“细粒度”数据的块,然后修复字段长度和校验和吗?

2 个答案:

答案 0 :(得分:2)

理论上是的。

但实际上,任何能够做到这一点的系统都能够在合理的时间内对jpeg进行解码和重新编码。

任何试图直接降低jpeg质量的代码都需要有以下两个阶段:

<强>阶段1 即可。解析jpeg文件以识别各种标记和有效负载 的阶段2 即可。剥去有效载荷的高熵部分并准备新文件。

  • 上面的第1阶段将具有jpeg解码器的复杂性。

  • 通过实施Phase2以比Q值更低的jpeg编码更快地执行,必须获得任何潜在的性能提升。这不是一个有吸引力的命题,因为编码时间随着Q因子 2 的减少而降低。换句话说,以较低Q因子编码图像数据几乎总是比试图剥离以更高Q因子编码的图像数据更快。


另一种方法(类似于你的想法)可以很好地用于jpeg图像的一个子集 - 渐进式JPEG (顺便说一下,它只是awesome)。< / p>

  

在渐进式JPEG图像中,组件以多次扫描进行编码。每个组件的压缩数据至少放置2次,最多扫描896次。初始扫描会创建图像的粗略版本,而后续扫描会对其进行细化。

 Baseline vs. Progressive JPEGs

基本上,扫描的数量决定了jpeg的质量,因为后者的扫描通过向图像添加细粒度的高熵信息来改进先前的扫描。

在jpeg流中,每个扫描由SOS(扫描开始标记)表示,其基本上是2个字节0xFF0xDA后跟有效负载,即该特定扫描中包含的编码数据(或“切片”在技术上准确)。

为了减小渐进式jpeg的大小,可以简单地从jpeg文件中读入预定数量的扫描/切片,然后以质量为代价丢弃后者。这可以在从文件中读取jpeg数据时实现,也可以稍后在编码数据上单次传递。


<子> 参考文献
1. en.wikipedia.org/wiki/JPEG
格雷戈里K.华莱士。 JPEG静态图片压缩标准。沟通 ACM,34(10),1991年10月 3. ece.ucdavis.edu/cerl/ReliableJPEG/Cung/jpeg.html

答案 1 :(得分:1)

感谢您的评论。

嗯,Motion-JPEG实际上是可用的最高质量的动态图像格式, 目前,它具有进一步加工和转化的巨大潜力 远未实现。

有几个方面需要考虑,我可以在这里举三个具体的例子。

首先,在汇编程序级别上通过特定于平台的JPEG编解码器优化来提升运行时性能的机会很大,如下所示:

通过针对特定ARM平台的极端软件优化,此应用程序在此设备上实现了比此专用硬件解决方案更快的速度!

其次,通过优化量化表,有些应用可以以相同的分辨率和相同的明显的质量显着减小给定JPEG图像的大小。 搜索ThinPic App和JPEGmini(似乎我不允许发布更多链接 这里)。

这些都是商业产品,因此没有免费的源代码。

第三,我要求降低给定Motion-JPEG文件的分辨率。 他们在数码相机上以1280x720拍摄,我想在一个窗口中播放它们 屏幕尺寸为640x360的半尺寸。

我使用了JPEG 8引入的新SmartScale功能来实现这种减少 通过简单地切断DCT块的高频系数来降低质量。 生成的文件大小的减少不是很大(大约小20%), 但使用4x4 DCT而不是播放640x360的要求要低得多 1280x720,8x8 DCT。

转码是使用经过特别改编的 VirtualDub jpegtran 源代码完成的 (IJG代码的新内存源和目标管理器随介绍了 这个用例)。使用经过特别改编的 ffdshow 源代码完成播放。 这是一个示范的实验设置,远非可分发的状态。

此致 Guido Vollbeding, 组织者独立JPEG组