在某些情况下,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) {} // Don't usually ignore exceptions!
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 大。