从 JDK 1.5.0_06 迁移到 1.8.0_66 - 替换已弃用的 Java JPEG 类

pan*_*kti 4 java jpeg java-8 javax.imageio

我目前正在将应用程序从 JDK 1.5.0_06 迁移到 1.8.0_66。在应用程序中,有多个文件使用 com.sun.image.codec.jpeg 类。当我尝试创建 JAR 时,出现以下错误。

error: package com.sun.image.codec.jpeg does not exist import com.sun.image.codec.jpeg.*;
Run Code Online (Sandbox Code Playgroud)

我参考了有关为 Java 7 替换已弃用的 Java JPEG 类的博客,我的错误已清除。但现在我收到以下警告:

warning: JPEGImageWriter is internal proprietary API and may be removed in a future release import com.sun.imageio.plugins.jpeg.JPEGImageWriter;
Run Code Online (Sandbox Code Playgroud)

博客中有问题的代码:

public static void saveAsJPEG(String jpgFlag, BufferedImage image_to_save, float JPEGcompression, FileOutputStream fos) throws IOException {
    // Image writer
    JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpeg").next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(fos);
    imageWriter.setOutput(ios);

    //and metadata
    IIOMetadata imageMetaData = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image_to_save), null);

    if (jpgFlag != null) {
        int dpi = 96;

        try {
            dpi = Integer.parseInt(jpgFlag);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

        //new metadata
        Element tree = (Element) imageMetaData.getAsTree("javax_imageio_jpeg_image_1.0");
        Element jfif = (Element) tree.getElementsByTagName("app0JFIF").item(0);
        jfif.setAttribute("Xdensity", Integer.toString(dpi));
        jfif.setAttribute("Ydensity", Integer.toString(dpi));
    }

    if (JPEGcompression >= 0 && JPEGcompression <= 1f) {
        // new Compression
        JPEGImageWriteParam jpegParams = (JPEGImageWriteParam) imageWriter.getDefaultWriteParam();
        jpegParams.setCompressionMode(JPEGImageWriteParam.MODE_EXPLICIT);
        jpegParams.setCompressionQuality(JPEGcompression);
    }

    //new Write and clean up
    imageWriter.write(imageMetaData, new IIOImage(image_to_save, null, null), null);
    ios.close();
    imageWriter.dispose();
}
Run Code Online (Sandbox Code Playgroud)

har*_*ldK 5

您代码中的问题行是:

JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpeg").next();
Run Code Online (Sandbox Code Playgroud)

根本不需要这种类型转换和特定子类 ( JPEGImageWriter) 的使用。不依赖特定的插件子类也是一个好习惯。在这种情况下,只需使用ImageWriter基类。

ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpeg").next();
Run Code Online (Sandbox Code Playgroud)

其他一切都将像以前一样工作和运行。

注意:JPEGImageWriteParam另一方面,该类是公共 APIjavax.imageio.plugins.jpeg包)的一部分,需要访问 JPEG 特定的写入选项。这个用法完全没问题。