假设我有一个之前以 JPEG 格式压缩的图像的无损版本(例如,如果您在 mspaint 中打开 JPEG 图像并将其保存为 BMP,我知道在此过程中会丢失一些元数据,但这不是我关心的)
我想知道这是否可能,以及如何在不损失图像质量的情况下将其转换回 JPEG 格式,这意味着每个像素都完全相同?
编辑:我完全理解将 JPEG 图像转换为无损格式不会给我带来任何额外的质量。我之所以问这个问题是因为:我有一个从 SWF 文件中提取的 PNG 文件。最初(在 SWF 文件中)对象是 JPEG 图像 + alpha 通道,与我拥有的 PNG 文件相比,其文件大小要小得多。我想要原始格式(JPEG + alpha 通道),但我不再有原始 SWF 文件的副本(我也没有在网上找到),所以我无法重新执行提取过程。
答案1
你问的其实是 JPEG 图像的解码过程是否可以逆转。这与传统 JPEG 编码器的目的截然不同,我不知道有任何软件可以实现这一点。从数学上来说,只要图像在编码后没有经过变换或其他修改,这在数学上是可能的*,但从编程上来说,这有多难呢?
第一个问题是色彩空间 - JPEG 使用子采样(在像素组中采样的颜色)yCbCr,而位图是 RGB。在这些色彩空间之间转换(以及在任何伽马调整中)不可避免的损失会引入噪声。要解决的第二个问题是 JPEG 将图像数据记录为宏块(NxN 大小的子图像),必须从解码器的输出图像中推断出来。可以在此处找到有关 JPEG 格式和编码过程的更深入解释http://www.guillermito2.net/stegano/jsteg/
‘取消解码’ JPEG:
要创建原始 JPEG 数据的近似值,我们需要找到宏块的子采样、大小和对齐方式,以及用于编码它们的离散余弦变换 (DCT) 系数。其余部分与正常的 JPEG 编码过程相同。我想到的一个简单实现是“有根据的猜测和检查”:假设使用一些常见的 JPEG 实现来创建图像,并尝试应用它们,直到找到一个具有“JPEG 类”DCT 结果(通常高频为零)的实现。
之后,微调系数,使与原始图像(即压缩图像的位图)相比的误差最小。此过程仍会导致误差和文件大小之间的权衡,但对于实际目的来说,它应该足够接近。
来源:以前的工作是验证 DNx 和 ProRes 视频编解码器,它们将类似 JPEG 的编码应用于每个单独的帧(软件反转解码帧将是一个非常有趣且可能有用的附带项目)。
* 存在一组输入数据,当它们通过原始 JPEG 解码器时将产生相同的输出,但是任何重建都是原始文件的逐字节副本(忽略元数据)的可能性极小,因为信息在解码过程中丢失了。
答案2
答案3
如果您使用任何编辑器打开 JPEG 图像并将其保存为 BMP,那么您获得的质量不会比文件本身的质量更高.jpg
。这就像将低比特率 mp3 文件(例如 128kbps)转换为更好的格式flac
,希望质量会以某种方式神奇地恢复。但事实并非如此。
正如 harrymc 所说的那样,当您第一次以 jpg 格式保存图像时,信息丢失了;无法从此 jpg 文件中恢复该信息。
有损压缩是“破坏性的”,或也称为“不可逆的”。请参阅https://en.wikipedia.org/wiki/Lossy_compression。
答案4
转换为 JPEG 几乎肯定会丢失信息。将该文件转换为 BMP 将保留存储在 JPEG 中的信息,但将 BMP 转换回 JPEG 可能会导致您丢失更多信息