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(); }

那么,换个角度问这个问题,通过上述方法,如何提高输出质量呢?

4

4 回答 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 等无损压缩格式适用于插图和线条艺术,其中有大面积的相似颜色,几乎没有渐变效果。

于 2009-06-08T23:49:22.730 回答
11

JPEG 对于内部带有文本的图像特别不利。一个不错的选择是 .PNG。

于 2009-06-08T23:50:23.087 回答
5

JPEG 保证保真度有所损失;这就是它实现压​​缩的方式。您可以选择不同的块大小来最小化伪影,但会有伪影。

GIF是无损的,JPEG是有损的;abc.jpg 永远不会是等价于 abc.gif 的像素。

于 2009-06-08T23:48:39.407 回答
2

粗略地说,JPEG 适用于具有摄影性质的图像。如果图像包含大量颜色变化、具有自然元素并且类似于现场环境,那么 JPEG 将提供良好的质量,并且没有可见的伪影。

如果图像是绘制的,或者包含大片单一颜色且不是摄影图像,则使用 PNG 压缩图像会更好。这是一种无损格式,可以处理 32 位颜色。

这些天你几乎不应该使用 GIF 格式的图像 - 该格式只支持 8 位颜色并且提供相对较差的压缩。

于 2009-06-08T23:55:11.080 回答