在某些情况下,JPEG图像的大小会比PNG图像大。
例如,在图像非常简单的情况下,PNG可能会更好地压缩图像并提供更好的图像质量。
以下是一些Java代码示例:
public static void main(String[] args)
{
BufferedImage img = new BufferedImage(
256,
256,
BufferedImage.TYPE_INT_RGB
);
Graphics g = img.getGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, 256, 256);
g.setColor(Color.black);
g.drawLine(0, 0, 255, 255);
g.drawLine(255, 0, 0, 255);
try
{
ImageIO.write(img, "jpg", new File("output.jpg"));
ImageIO.write(img, "png", new File("output.png"));
}
catch (IOException e) {}
g.dispose();
}
以上代码生成了一个尺寸为256 x 256像素的图像,并以“X”的形式绘制了两条相交的对角线。
使用256 x 256的图像是为了将图像大小保持为8的倍数,因为JPEG压缩对图像的8 x 8像素部分执行2D DCT变换。通过保持图像大小和线条位置与8 x 8像素部分对齐,可以减少压缩伪影的数量,并提高图像质量。
(选择256 x 256是经验性的——我最初使用了100 x 100,发现JPEG图像很糟糕,所以我尝试了64 x 64,看起来更好,所以我将其放大以模拟更真实的图像大小。)
绘制完图像后,程序会生成一个JPEG文件和一个PNG文件。(Java ImageIO库使用默认压缩比0.75f作为JPEG的压缩质量。)
结果:
output.png : 1,308 bytes
output.jpg : 3,049 bytes
看这张图片本身,JPEG 有一点伪像,但是直到我使用图像编辑器放大后才变得很明显。当然,PNG 图像是无损的,所以它是原始图像的精确表示。
总之,一个图像是用 PNG 还是 JPEG 更小其实取决于来源,有些情况下 JPEG 可能比 PNG 更大,但 PNG 可能更好质量。当然,在实践中,通常对于给定的图像,PNG 会比 JPEG 更大。