如何在这段代码中替换com.sun.image.codec.jpeg.JPEGImageEncoder?

40

我曾经使用过com.sun.image.codec.jpeg.JPEGImageEncoder来处理JPEG图像,例如网站中的图表等。现在,我正在升级我的机器以使用JDK7,但这个版本已经弃用了这个类。以下是我需要更改的代码:

public void processChart(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("image/jpeg");
    out = response.getOutputStream();
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires",0);
    try {
        int w = Integer.parseInt(request.getParameter("WIDTH"));
        int h = Integer.parseInt(request.getParameter("HEIGHT"));
        java.awt.image.BufferedImage ChartImage = new java.awt.image.BufferedImage(w,h,java.awt.image.BufferedImage.TYPE_INT_RGB);
        java.awt.Graphics2D ChartGraphics = ChartImage.createGraphics();
        Chart c = getChart(request);
        c.setSize(w,h);
        c.paint(ChartGraphics);
        // CODE BELOW TO CHANGE...
        com.sun.image.codec.jpeg.JPEGImageEncoder encoder = 
                                 com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(out);
        encoder.encode(ChartImage);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private Chart getChart(HttpServletRequest request) {
    chartLoader loader = new chartLoader(null);
    loader.paintDirect = true;
    java.util.Enumeration ps = request.getParameterNames();
    while (ps.hasMoreElements()) {
        String name = (String) ps.nextElement();
        loader.setParameter(name,request.getParameter(name));
    }
    // create Chart
    Chart chart = loader.build(false,false);
    Chart.tmpImage = new java.awt.image.BufferedImage(200,200,java.awt.image.BufferedImage.TYPE_INT_RGB);
    return chart;
}

你好,能否请您分享一下您用于图像转换的库的版本?我也遇到了同样的问题,但是我认为这可能是库的某些问题。如果您能分享Maven依赖项,那就太好了。 - NoNaMe
3个回答

48

使用ImageIO,它可以直接读写JPEG、PNG、GIF和BMP格式的图片。

ImageIO.write(ChartImage, "jpeg", out);

通常静态的 write(...)read(...) 方法已经足够,如果需要控制压缩或处理图像元数据,请查看Java Image I/O API Guide


我有一些JPEG图片,使用ImageIO无法正确读取,但使用旧的sun类(CMYK等)可以正常读取。 - Tony BenBrahim
3
对于CMYK,这篇StackOverflow的答案可能会有所帮助:https://dev59.com/znE95IYBdhLWcg3wN7Kv#2408779。 - Philipp Reichart
是的,它做到了。谢谢。 - Tony BenBrahim

16

3

在Java 8中,com.sun.image.codec.jpeg.JPEGImageEncoder可以正常工作,但在Java 11中无法工作。

在我的项目中,我使用了Java 8,并升级到了Java 11,结果遇到了同样的问题。

我的代码如下:

File output = new File(newFilename);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(new FileOutputStream(output));
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bufferedImage);
param.setQuality(1.0f, true);
encoder.setJPEGEncodeParam(param);
encoder.encode(bufferedImage);

我已删除上面的代码,并用下面的代码替换,现在它可以正常工作。

ImageIO.write(bufferedImage, "jpg", response.getOutputStream());

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