为什么我从gif文件转换的jpg文件不够清晰?

3
我使用以下代码将gif文件转换为jpg文件,它可以工作,但是结果jpg文件的质量不如原始gif文件,为什么?有没有办法提高质量?
try
{
  ImageIO.write(ImageIO.read(new File("C:/abc.gif")),"jpg",new File("C:/abc.jpg"));
}
catch (Exception e) { e.printStackTrace(); }

所以,换个角度问这个问题,采用以上方法,如何提高输出质量?

参见:https://dev59.com/gnE95IYBdhLWcg3wY81l - Chuck Le Butt
4个回答

20

JPEG是一种有损图像压缩格式,它会丢弃人眼难以察觉的信息。然而,根据在压缩图像时设置的图像质量,压缩伪影,如方块状和模糊可能会变得可见--这就是图像不清晰的原因。

可能ImageIO.write方法保存的JPEG质量设置比必要的低,以保持图像足够好看。

为了将质量设置更高,需要使用ImageWriteParam来指定图像质量设置,然后使用ImageWriter输出JPEG。

例如:

// Get a writer for JPEG.
ImageWriter iw = ImageIO.getImageWritersByFormatName("jpeg").next();
iw.setOutput(new FileImageOutputStream(outputFile));

// Set the compression quality to 0.9f.
ImageWriteParam iwParam = iw.getDefaultWriteParam();
iwParam.setCompressionQuality(0.9f);

// Write image
iw.write(null, new IIOImage(imageToWrite, null, null), iwParam);

感兴趣的方法:

如其他答案所述,JPEG不适合压缩文本和插图。如果目标是保留图像质量,但文件大小可以比使用JPEG进行压缩更大,则使用无损图像压缩格式,例如PNG,将保留图像质量,而不会出现任何损失。然而,在许多情况下,PNG文件的文件大小将大于JPEG。(但并非总是如此。)
一般的经验法则是,对于照片和其他逼真的图像,有损压缩格式,如 JPEG,可在文件大小与质量之间进行很好的平衡,而无损压缩格式,如 PNG,则适用于插图和线条艺术等领域,在这些领域中,存在大面积的相似颜色和较少的渐变效果。

太好了,它“几乎”像我预期的那样工作!但我注意到了一些有趣的事情,我读取了一个png图像并将CompressionQuality设置为1.0f,我以为输出会看起来像原始图像,但实际上,浅蓝色变成了深蓝色,由于这是股票图表,我不介意,我很高兴它能正常工作!谢谢!您可以使用以下图表进行尝试: http://ichart.finance.yahoo.com/z?s=ibm&t=6m&q=b&l=off&z=m&p=&a=v,r14,ss,w14 - Frank
@Frank:即使在1.0f的压缩质量下,压缩也会带来损失,因此输出的质量不会与原始质量完全相同。我之前观察到了颜色方面的变化,这可能就是有损压缩的一个影响。 - coobird

11

JPEG 对于带有文本的图片来说效果不佳。一种较好的替代方案是 .PNG。


5

JPEG保证了一定的信息丢失,这是它实现压缩的方式。你可以选择不同的块大小来最小化伪影,但仍会存在伪影。

GIF是无损的,而JPEG是有损的;abc.jpg永远不可能与abc.gif在像素上完全相等。


2
JPEG标准中有一部分是无损的,但是没有人费心去实现它 :) - Joey
2
尽管GIF是无损的,但值得注意的是它是一种无损索引色格式,因此从Truecolor源保存时会丢失一些颜色信息。JPEG是一种有损的真彩色格式,因此索引图像被升级为真彩色(没有质量改进),然后在JPEG/DCT意义上“平均化”(伴随着相应的质量下降)。 - Stobor
GIF标准还有一部分是有损的。唉,事情并不那么简单 :) - zildjohn01

2
粗略地说,JPEG适用于照片风格的图片。如果图片颜色变化较大,自然元素丰富并类似真实环境,则JPEG将提供良好质量且不会出现明显的伪影。
如果图片是绘制的或包含大面积单一颜色而非照片,则使用PNG压缩效果更佳。这是一种无损格式,可以处理32位颜色。
如今几乎不应再使用GIF格式的图片——该格式仅支持8位颜色且提供相对较差的压缩效果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接