以编程方式减少JPEG文件大小

时间:2011-07-26 13:09:21

标签: java graphics 2d jpeg

为任何无知道歉,但我以前从未使用过Java中的jpeg图像(更不用说任何类型的图像)了。

假设我想将一个jpeg图像从Web服务发送到客户端。有没有什么方法可以通过某种方式操纵图像的颜色配置文件来减少jpeg文件的大小?

我已经能够通过使用名为imgscalr的BufferedImages的简洁工具来缩小图像大小。请参阅here

我还想要一个颜色比高质量jpeg图像少的jpeg。例如,我希望能够在我的jpeg中使用8位颜色而不是16位颜色。

如果我有来自Java 2D包的BufferedImage,我到底需要改变什么呢?

4 个答案:

答案 0 :(得分:4)

减少图像大小的另一种方法是更改​​压缩级别。你可以使用ImageWriter来做到这一点。

    ImageWriter writer = null;
    Iterator<ImageWriter> iwi = ImageIO.getImageWritersByFormatName("jpg");
    if (!iwi.hasNext())
        return;
    writer = (ImageWriter) iwi.next();
    ImageWriteParam iwp = writer.getDefaultWriteParam();
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT) ;
    iwp.setCompressionQuality(compressionQuality);
    writer.setOutput(...);
    writer.write(null, image, iwp);

答案 1 :(得分:1)

最简单的方法是将字节流解压缩为Java Image,可选择调整其大小(使其更小),然后使用所需的质量设置从中重新生成JPEG图像。

然后,这个新图像将发送给客户端。

答案 2 :(得分:1)

查看ImageIO课程。至于减小文件大小:由于图像已经是JPEG,你唯一能做的就是降低质量或图像尺寸。

要记住的另一件事:如果图像是CMYK jpeg,它可能会更大。遗憾的是ImageIO无法处理这些问题,但您可以尝试JAI ImageIO将CMYK转换为RGB(应该更小)。

答案 3 :(得分:1)

其中两种可能的解决方案是降低图像尺寸,以下是您的工作方式:

BufferedImage original = //your image here
scaled = original.getScaledInstance(finalWidth, finalHeight, Image.SCALE_SMOOTH); // scale the image to a smaller one

BufferedImage result = new BufferedImage(finalWidth, finalHeight, original.getType());
Graphics2D g = result.createGraphics();     

g.drawImage(scaled, 0, 0, null); //draw the smaller image
g.dispose();

显然,您必须计算缩放的宽度和高度,以使图像保持相同的宽高比。

将图像缩小后,您现在可以将此图像转换为JPEG文件:

BufferedImage image = // this is the final scaled down image

JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(output);
JPEGEncodeParam jpegEncodeParam = jpegEncoder.getDefaultJPEGEncodeParam(image);

jpegEncodeParam.setDensityUnit(JPEGEncodeParam.DENSITY_UNIT_DOTS_INCH);
jpegEncodeParam.setXDensity(92);
jpegEncodeParam.setYDensity(92);

jpegEncodeParam.setQuality( 0.8F , false);
jpegEncoder.encode(image, jpegEncodeParam);

这些类来自 JAI 包(更确切地说是 com.sun.image.codec.jpeg ),JVM可能会抱怨它们不应该直接使用,但你可以忽略它。

您可以从here下载JAI,如果它不起作用我为两个库设置了github镜像,JAI coreJAI ImageIO