能否将由JPG格式制作的BMP文件重新编码为JPG格式而不会损失质量?

4
有时我会将JPG图像保存为未压缩位图(BMP / PNG),以便我在对图像进行更改时保持其质量。
我想知道,是否有理论可能将位图重新编码回其原始的JPG格式,而不会失去任何质量(除了我编辑过的区域)?
编辑:我思考着如何通过暴力破解来找到BMP数据块的原始JPG信息设置, 从而生成一个与原始JPG没有任何区别的JPG。我对JPG格式不太了解,不能确定是否可能实现,但我认为至少在一些有限的时间内,你可以暴力破解8x8块?

2
转换为JPEG是有损的,即使眼睛看不到。使用PNG代替BMP。您可以获得更好的无损压缩。 - Gimmy
1
@Gimmy,你没有抓住重点。请仔细阅读整个问题。 - Rookie
4个回答

3
JPEG压缩是有损的,因此当您将.bmp文件重新编码为JPEG时,会丢失一些信息。如果图像非常简单(例如只有一个黑色像素或全部都是黑色,例如1像素),则可以在无损情况下进行重新编码。
您可以在这里看到多次重新编码的JPEG示例。
您可以对JPEG执行一些无损操作,来自维基百科
可以对JPEG图像进行许多无损更改(即,没有重新压缩和相关的质量损失),只要图像大小是1 MCU块(最小编码单元)的倍数(通常在两个方向上为16个像素,用于4:2:0色度子采样)。实现此功能的实用程序包括jpegtran,具有用户界面Jpegcrop和IrfanView的JPG_TRANSFORM插件。
可以将块以90度的增量旋转,在水平,垂直和对角线轴上翻转并在图像中移动。修改后的图像中不需要使用所有来自原始图像的块。
JPEG图像的顶部和左边缘必须位于8×8像素块边界上,但是底部和右边缘不需要这样做。这限制了可能的无损裁剪操作,并防止翻转和旋转底部或右侧边缘不位于所有通道的块边界上(因为该边缘将最终出现在必须是块边界的顶部或左侧)。
在使用无损裁剪时,如果裁剪区域的底部或右侧未在块边界上,则来自部分使用的块的其余数据仍将存在于裁剪文件中并且可以恢复。
此外,多个JPEG图像可以无损地连接在一起,只要边缘与块边界重合即可。

2
我正在寻找的是以某种方式“暴力破解”来找到(8x8)BMP块的原始JPG块信息,这样就可以将BMP图像转换回JPG而没有任何差异。当我考虑到这一点时,我只是认为它应该是可能的 - 为什么不呢? - Rookie

2

根据sbridges详细的回答和你问题的一个具体部分,我会说是的

(我想知道,是否有理论上的可能将位图重新编码为其原始的JPG格式,而不会失去任何质量,(除了我编辑的区域)?)

我认为这里的主要问题是,您必须更直接地编辑JPEG。当您编辑块时,会丢失数据。因此,您可以将其更改为BMP以进行编辑,但然后您需要跟踪(或稍后比较和识别)所更改的像素。然后,您需要在JPEG中编辑那些特定的块,并保持所有未编辑的块不变。这样,所有未编辑的块都不会有质量损失,但您更改的块将遭受解码/更改/重新编码的质量损失。

由于实际实现的复杂性,这是可能的,但它可能不值得这么多工作。


这里的问题不在于编辑(我只是包含它来展示重新编码的有用性)。问题是,是否可能,也许如何?至少这很有趣。真的那么难吗? - Rookie

2
理论上可以将已知来自JPEG格式的BMP图像无损编码回JPEG格式。也就是说,可以执行以下转换:
JPEG A => BMP X -> JPEG B => BMP X
其中"=> "是解压缩操作,“->”是一种压缩操作。
请注意,这并不完全符合您的要求。您要求上述操作加上JPEG A == JPEG B。我怀疑(但不确定)每个JPEG表示都解码为唯一的图像,因此我的猜测是无法做出此保证。
之所以可能进行无损编码,是因为特定大小和深度的图像的JPEG表示数量是有限的。这个数字虽然无法处理,但仍然是有限的。一种编码算法可能只需解码每个表示形式,直到找到与您的BMP图像完全匹配的表示形式,并输出该表示形式。该算法完全不切实际,但显示了问题的局限性。
实际的算法可能存在。例如,可以想象一种迭代方法,如:
选择初始压缩参数(颜色采样和量化)。将BMP图像压缩为候选JPEG。解压候选JPEG。将解压后的图像与原始BMP进行比较。 - 如果相同,则输出候选JPEG并终止。 - 如果不同,则更新压缩参数并返回到步骤2。
关键在于更新步骤 - 弄清楚图像差异如何指导您改进参数。
您可能能够编写能在绝大多数情况下工作的代码。有基本上只有3种颜色采样选择,我猜生成量化矩阵的算法也不是很多。您可以实现它们全部,或者扫描互联网以获取JPEG文件并记录唯一的压缩参数。然后,您预计主要会在新编写的压缩器的图像上失败。
重要的是要注意,这些方法依赖于使用相同的解压缩器进行操作,因为不同的解压缩器可能无法从一个JPEG文件中按位产生完全相同的图像。

1
基本上,这里涉及到图像格式和压缩。首先,让我们关注一下允许您将JPEG图像转换为BMP的过程。 BMP由具有R.G.B值的像素地图形成。因此,在视觉方面和边缘方面,您不应该观察到原始JPEG图像和此图像在BMP中的转换之间的差异(分辨率问题除外)。
相反,正如其他贡献者和这里所说的那样(http://en.wikipedia.org/wiki/JPEG),JPEG格式使用一个压缩矩阵(DCT),它将在某种程度上改变您图片的梯度。
在大多数情况下,我倾向于说它行不通,除了对于简单的图片(均匀背景上的均匀形状)。它不适用于相机或视频图片。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接