有时我将 JPG 图像保存为未压缩的位图 (BMP/PNG),以便在更改图像时保持质量。
我想知道,理论上是否可以将位图重新编码回其原始 JPG 格式,而不会损失任何质量(我编辑的区域除外)?
编辑:我正在考虑以某种方式强制它找到该 BMP 数据块的原始 JPG 信息设置,从而从 BMP(之前是 JPG)生成 JPG,与原始 JPG 没有任何区别。我对 JPG 格式的了解还不够,不能说它是否可能,但我想不出为什么不,至少在有限的时间内你可以蛮力 8x8 块?
有时我将 JPG 图像保存为未压缩的位图 (BMP/PNG),以便在更改图像时保持质量。
我想知道,理论上是否可以将位图重新编码回其原始 JPG 格式,而不会损失任何质量(我编辑的区域除外)?
编辑:我正在考虑以某种方式强制它找到该 BMP 数据块的原始 JPG 信息设置,从而从 BMP(之前是 JPG)生成 JPG,与原始 JPG 没有任何区别。我对 JPG 格式的了解还不够,不能说它是否可能,但我想不出为什么不,至少在有限的时间内你可以蛮力 8x8 块?
JPEG 压缩是有损的,因此当您将 .bmp 重新编码为 JPEG 时,您会丢失一些信息。如果图像是微不足道的(例如 1 个黑色像素 1 个黑色全黑,例如 1 个像素),您可以重新编码而不会丢失。
您可以在此处看到 JPEG 被多次重新编码的示例。
您可以从wikipedia对 JPEG 进行一些无损操作:
只要图像大小是 1 个 MCU 块(最小编码单元)的倍数(通常双向 16 个像素,用于 4:2:0 色度二次采样)。实现此功能的实用程序包括 jpegtran,带有用户界面 Jpegcrop,以及 IrfanView 的 JPG_TRANSFORM 插件。
块可以以 90 度增量旋转,在水平、垂直和对角轴上翻转并在图像中移动。并非原始图像中的所有块都需要在修改后的图像中使用。
JPEG 图像的上边缘和左边缘必须位于 8 × 8 像素块边界上,但下边缘和右边缘不必这样做。这限制了可能的无损裁剪操作,并且还防止了底部或右侧边缘不位于所有通道的块边界上的图像的翻转和旋转(因为边缘最终会在顶部或左侧,其中 - 如前所述 -块边界是强制性的)。
使用无损裁剪时,如果裁剪区域的底部或右侧不在块边界上,则部分使用的块中的其余数据仍将存在于裁剪文件中并且可以恢复。
也可以在基线格式和渐进格式之间进行转换而不会损失任何质量,因为唯一的区别是系数在文件中的放置顺序。
此外,只要边缘与块边界重合,就可以将多个 JPEG 图像无损地连接在一起。
理论上,可以将已知来自 JPEG 格式的 BMP 图像无损编码回 JPEG 格式。也就是说,您可以进行以下转换:
JPEG A => BMP X -> JPEG B => BMP X
其中=>
是解压缩操作,->
是压缩操作。
请注意,这并不是您要问的。你在问上面加上那个JPEG A == JPEG B
。我怀疑(但不确定)每个 JPEG 表示都解码为唯一的图像,所以我的猜测是无法做出这种保证。
可以进行无损编码的原因是特定大小和深度的图像的 JPEG 表示数量有限。这个数字大得难以控制,但它仍然是有限的。编码算法可能只是对这些表示中的每一种进行解码,直到找到与 BMP 图像完全匹配的表示,然后输出该表示。该算法完全不切实际,但表明问题是有界的。
一个实用的算法很可能存在。例如,可以想象一种迭代方法,例如:
诀窍在于更新步骤 - 弄清楚图像差异如何指导您改进参数。
您可能能够编写在绝大多数情况下都可以工作的代码。基本上只有 3种颜色采样选择,我的猜测是生成量化矩阵的算法并不多。您可以全部实现它们,或者在互联网上扫描 JPEG 文件并记录唯一的压缩参数。然后,您会期望主要在来自新编写的压缩器的图像上失败。
重要的是要注意,这些方法依赖于对=>
操作使用相同的解压缩器,因为不同的解压缩器可能不会从一个 JPEG 文件中生成相同的图像位。
根据 sbridges 的详细答案和您问题的特定部分,我会说Yes。
(我想知道,理论上是否可以将位图重新编码回其原始 JPG 格式,而不会损失任何质量,(除了我编辑的区域)?)
我认为这里的主要问题是您必须更直接地编辑 JPEG。编辑块时会丢失数据。因此,您可以将其更改为 BMP 进行编辑,但随后您需要跟踪(或稍后比较和识别)您更改的像素。然后,您需要编辑 JPEG 中的那些特定块,并保留所有未编辑的块不变。这样,所有未编辑的块都不会有质量损失,但您更改的块将遭受解码/更改/重新编码质量损失。
由于实际实现它的复杂性,这是可能的,但它可能不值得大量的工作。
基本上,我们在这里处理图像格式和压缩。首先,让我们关注允许您将 JPEG 图像转换为 BMP 的过程。BMP 由具有 RGB 值的像素图组成。因此,就视觉方面和边缘而言,您不应观察到原始 JPEG 图像与 BMP 中此图片的转换之间的差异(分辨率问题除外)。
相反,正如其他贡献者和此处 ( http://en.wikipedia.org/wiki/JPEG ) 所说,JPEG 格式使用压缩矩阵 (DCT),它会以某种方式改变图片的渐变。
在大多数情况下,我倾向于说它不起作用,除了简单的图片(统一背景颜色上的同质形状)。它不适用于凸轮或视频图片。