首页 文章

是否有可能将JPG制造的BMP重新编码回JPG而不会降低质量?

提问于
浏览
4

有时我将JPG图像保存为未压缩的位图(BMP / PNG),以便在我对图像进行更改时保持质量 .

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

Edit: 我在想某种方式来强制它找到该BMP数据块的原始JPG信息设置,从而从BMP(以前是JPG)生成JPG而与原始JPG没有任何差别 . 我甚至不可能,但我想不出为什么不这样做,至少在某些时候你可以暴力强迫8x8阻挡?

4 回答

  • 2

    JPEG压缩是有损的,因此当您将其重新编码为JPEG时,会丢失.bmp中的某些信息 . 如果图像是微不足道的(例如1个黑色pixel1黑色全黑,例如1个像素),您可以重新编码而不会丢失 .

    您可以看到多次重新编码JPEG的示例here .

    您可以对无损的JPEG进行一些操作,来自wikipedia

    只要图像大小是1个MCU块(最小编码单位)的倍数(通常在两个方向上为16个像素),就可以无损地执行JPEG图像的多种更改(即,无需再压缩和相关的质量损失) ,对于4:2:0色度子采样) . 实现此功能的实用程序包括jpegtran,用户界面Jpegcrop和IrfanView的JPG_TRANSFORM插件 . 块可以以90度的增量旋转,在水平,垂直和对角轴上翻转,并在图像中移动 . 并非原始图像中的所有块都需要在修改后的块中使用 . JPEG图像的顶部和左侧边缘必须位于8×8像素块边界上,但是底部和右侧边缘不需要这样做 . 这限制了可能的无损裁剪操作,并且还防止了图像的翻转和旋转,其底部或右边缘不位于所有通道的块边界上(因为边缘将在顶部或左侧结束,其中 - 如上所述 - 块边界是强制性的) . 使用无损裁剪时,如果裁剪区域的底部或右侧不在块边界上,则部分使用的块中的其余数据仍将存在于裁剪文件中并可以恢复 . 也可以在基线和渐进格式之间进行转换而不会有任何质量损失,因为唯一的区别是系数放置在文件中的顺序 . 此外,只要边缘与块边界重合,几个JPEG图像就可以无损地连接在一起 .

  • 2

    基于sbridges的详细答案,以及你问题的具体部分,我会说 Yes .

    (我想知道,理论上可以将位图重新编码回原始的JPG格式,而不会丢失任何质量, (except for the areas I edited) ?)

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

    由于实际实现这一点的复杂性,这是可能的,但它可能不值得工作量 .

  • 1

    理论上可以将已知来自JPEG格式的BMP图像无损编码回JPEG格式 . 也就是说,您可以执行以下转换:

    JPEG A => BMP X -> JPEG B => BMP X

    其中 => 是解压缩操作, -> 是压缩操作 .

    请注意,这不是你要求的 . 你问上面 plus 那是 JPEG A == JPEG B . 我怀疑(但不确定)每个JPEG表示都会解码为一个独特的图像,所以我的猜测是无法做出这种保证 .

    可以进行无损编码的原因是存在特定大小和深度的图像的有限数量的JPEG表示 . 这个数字难以管理,但仍然是有限的 . 编码算法可以简单地解码这些表示中的每一个,直到找到与您的BMP图像完全匹配的那个,然后输出表示 . 该算法完全不切实际,但表明问题是有限的 .

    可能存在实用的算法 . 例如,人们可以想象一种迭代方法,如:

    • 选择初始压缩参数(颜色采样和量化) .

    • 将BMP图像压缩为候选JPEG .

    • 解压缩候选JPEG .

    • 将解压缩的图像与原始BMP进行比较 .

    • 如果相同,则输出候选JPEG并终止 .

    • 如果不同,请更新压缩参数并返回步骤2 .

    诀窍在于更新步骤 - 弄清楚图像差异如何引导您改进参数 .

    您可能能够编写在绝大多数情况下都能工作的代码 . 有basically only 3 color sampling choices,我的猜测是没有那么多算法来生成量化矩阵 . 您可以全部实现它们,或者在Internet上扫描JPEG文件并记录唯一的压缩参数 . 那么你会期望主要失败来自新写的压缩器的图像 .

    重要的是要注意,这些方法依赖于对 => 操作使用相同的解压缩器,因为不同的解压缩器可能不会从一个JPEG文件产生相同的位图像位 .

  • 4

    基本上,我们在这里处理图像格式和压缩 . 首先,让我们关注允许您将JPEG图像转换为BMP的过程 . BMP由具有R.G.B值的像素图形成 . 因此,就视觉方面和边缘而言,您不应该观察到原始JPEG图像与BMP中此图片的转换之间的差异(解决分辨率问题) .

    相反,正如其他贡献者所说的那样(http://en.wikipedia.org/wiki/JPEG),JPEG格式使用压缩矩阵(DCT),它会以某种方式改变图片的渐变 .

    在大多数情况下,我倾向于说它不会起作用,例外的简单图片(均匀背景颜色上的均匀形状) . 它不适用于凸轮或视频图片 .

相关问题