【问题标题】:Is it possible to re-encode a BMP made of JPG back to JPG without loss of quality?是否可以在不损失质量的情况下将由 JPG 制成的 BMP 重新编码回 JPG?
【发布时间】:2013-06-14 20:51:42
【问题描述】:

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

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

编辑:我想以某种方式强制它找到该 BMP 数据块的原始 JPG 信息设置,从而从 BMP(之前是 JPG)生成 JPG 而没有任何与原始 JPG 的区别。我对 JPG 格式的了解还不够,无法说出它是否可能,但我想不出为什么不,至少在某些 有限 时间内你可以蛮力 8x8 块?

【问题讨论】:

  • 转换为 jpeg 是有损的,即使肉眼看不到。使用 PNG 而不是 bmp。您可以获得更好的无损压缩。
  • @Gimmy,你没抓住重点。阅读整个问题?

标签: bitmap jpeg bmp image-compression


【解决方案1】:

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

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

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

可以无损地对 JPEG 图像进行许多更改 (即,没有重新压缩和相关的质量损失)为 只要图像大小是 1 个 MCU 块的倍数(最小编码 单位)(通常在两个方向上为 16 个像素,用于 4:2:0 色度 二次抽样)。实现此功能的实用程序包括 jpegtran, 用户界面 Jpegcrop,以及 IrfanView 的 JPG_TRANSFORM 插件。

方块可以以 90 度为增量旋转,在 水平,垂直和对角轴并在图像中移动。 并非原始图像中的所有块都需要在修改后使用 一个。

JPEG 图像的上边缘和左边缘必须位于 8 × 8 像素块上 边界,但底部和右侧边缘不需要这样做。这限制了 可能的无损裁剪操作,还可以防止翻转和 底部或右侧边缘不位于 a 上的图像的旋转 所有通道的块边界(因为边缘最终会在顶部 或左,其中 - 如前所述 - 块边界是强制性的)。

使用无损裁剪时,如果裁剪的底部或右侧 区域不在块边界上,则其余数据来自 部分使用的块仍将存在于裁剪文件中,并且 可以恢复。

也可以在基线和渐进之间转换 格式没有任何质量损失,因为唯一的区别是 系数在文件中的放置顺序。

此外,多个 JPEG 图像可以无损连接在一起,如 只要边缘与块边界重合。

【讨论】:

  • 我正在寻找的是以某种方式“强制”它找到(8x8)BMP 片段的原始 JPG 块信息,这样就可以将 BMP 图像转换回 JPG 而没有任何差异。当我想到这一点时,我只是认为它应该是可能的——为什么不呢?
【解决方案2】:

根据 sbridges 的详细答案和您问题的特定部分,我会说

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

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

由于实际实现它的复杂性,它可能的,但它可能不值得大量的工作。

【讨论】:

  • 这里的问题与编辑无关(我只是将其包含在此处以显示此重新编码的有用性)。问题是,这是否可能,也许如何?至少会很有趣。真的有那么难吗?
【解决方案3】:

理论上可以将已知来自 JPEG 格式的 BMP 图像无损编码回 JPEG 格式。也就是可以做如下变换:

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

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

请注意,这不是您所要求的相当。你在问上面的 plusJPEG A == JPEG B。我怀疑(但不确定)每个 JPEG 表示都解码为唯一的图像,所以我的猜测是无法做出这种保证。

可以进行无损编码的原因是特定大小和深度的图像的 JPEG 表示数量有限。这个数字大得难以控制,但它仍然是有限的。编码算法可能只是对这些表示中的每一种进行解码,直到找到与 BMP 图像完全匹配的表示,然后输出该表示。该算法完全不切实际,但表明问题是有界的。

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

  1. 选择初始压缩参数(颜色采样和量化)。
  2. 将 BMP 图像压缩为候选 JPEG。
  3. 解压缩候选 JPEG。
  4. 将解压后的图像与原始 BMP 进行比较。
    • 如果相同,则输出候选JPEG并终止。
    • 如果不同,请更新压缩参数并返回步骤 2。

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

您也许能够编写在绝大多数情况下都可以使用的代码。有basically only 3 color sampling choices,我的猜测是没有很多算法可以生成量化矩阵。您可以全部实现它们,或者在互联网上扫描 JPEG 文件并记录唯一的压缩参数。那么你会认为主要是在新编写的压缩器的图像上失败。

请务必注意,这些方法依赖于对=> 操作使用相同的解压缩器,因为不同的解压缩器可能不会从一个 JPEG 文件中逐位生成相同的图像。

【讨论】:

    【解决方案4】:

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

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

    在大多数情况下,我倾向于说它不起作用,除了简单的图片(统一背景颜色上的同质形状)。它不适用于摄像头或视频图片。

    【讨论】:

      猜你喜欢
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 2020-06-01
      相关资源
      最近更新 更多