Java - 压缩图像而不会造成质量损失

时间:2015-08-19 22:09:33

标签: java image compression

我有一个大小为2.1mb的jpeg图像。我试图尽可能地压缩图像数据。可能低于1mb。目前我已经对这个主题做了一些研究,并且我已经编写了一些代码来尝试压缩数据。我偶然发现了这个答案:

https://stackoverflow.com/a/4535883/3011902

基于此,我已将Image文件转换为字节数组,然后将字节数组转换为其等效的二进制数组。然后我对二进制数据使用行程编码。这使得尺寸更大。

我试图将文件转换为png。但这大大增加了文件大小; 9MB。

那么Java中压缩和图像文件大小没有质量损失的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

JPEG是原始源图像的有损图像压缩。 加载JPEG压缩图像时,与原始数据(W x H)和每像素数据(BPP)相同 - 虽然信息已经损坏/原始信息的量化。这意味着相同数量的数据表示原始信息的 less

尝试将无损压缩 - 无论是PNG还是手动RLE - 应用于恢复的图像 1 将导致更大的文件大小,因为新压缩将忠实地保留工件和现有信息丢失 4 。由于JPEG可能会引入额外的噪声,因此恢复的数据甚至可能会使无损压缩技术的效率降低。

使用原始原始图像信息(RAW,BMP,TIFF)开始获得最佳压缩/质量权衡;根据需要应用图像压缩格式。这可能是选择无损格式(如PNG,WEBP),也可能选择具有不同压缩设置的JPEG(有多种变体)等有损格式。 如果图像已经是有损JPEG,那么最佳解决方案(不降低图像/数据大小)可能只是让它不受影响。

根据图像的内容,不同的压缩算法将获得不同的结果 - 包括有损格式的明显质量损失。例如,一个简单的RLE 2 压缩可以很好地适用于许多大型同色区域的图像,但JPEG可以更好地工作 照片 3

1 如果在已经表示压缩数据良好的字节流上应用一般压缩(例如DEFLATE,bzip2),则可能会节省一定比例的空间。然而,由于在这种情况下图像首先恢复,因此将无损图像压缩重新应用于加载的完整数据'图像。

2 在其他技巧中,PNG应用了几种RLE风格的算法,可能与手动实现一样好或更好。 PNG特别适合通常相对简单的图标(与照片相比),并且在恢复时必须是像素完美的。

3 JPEG可以很好地压缩照片的部分原因是它有目的地抛弃了对人类视觉不太重要的信息,并且适用于人类感知的足够好的信息。近似于压缩块。

4 即使重新保存JPEG图像(修改后)也会导致图像质量进一步下降;有一些关于' JPEG转码的论文'这可能是一个有趣的阅读。