【问题标题】:How to replace com.sun.image.codec.jpeg.JPEGImageEncoder in this code?如何在此代码中替换 com.sun.image.codec.jpeg.JPEGImageEncoder?
【发布时间】:2011-12-22 08:26:32
【问题描述】:

我在我的 web 应用程序中使用 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 依赖项,那就太好了。

标签: java java-7


【解决方案1】:

com.sun.image.codec.jpeg.JPEGImageEncoder 在 Java 8 中运行良好,但在 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());

【讨论】:

    【解决方案2】:

    永远不要使用 com.sun.** 包中的类。使用ImageIO 将图像编码为字节。

    阅读ImageIO tutorial

    【讨论】:

      【解决方案3】:

      使用ImageIO,它可以开箱即用地读取/写入JPEG、PNG、GIF和BMP。

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

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

      【讨论】:

      • 我的 JPEGS 无法使用 ImageIO 正确读取,但可以使用旧的 sun 类(CMYK 等)。
      • 对于 CMYK,这个其他 SO 答案可能会有所帮助:stackoverflow.com/a/2408779/180740
      • 是的。谢谢
      猜你喜欢
      • 2021-09-09
      • 2015-02-20
      • 1970-01-01
      • 2018-09-16
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 2023-01-12
      相关资源
      最近更新 更多