2016-01-21 63 views
3

我目前正在將應用程序從JDK 1.5.0_06遷移到1.8.0_66。在應用程序中,有多個使用com.sun.image.codec.jpeg類的文件。當我嘗試創建JAR時,出現以下錯誤。從JDK 1.5.0_06遷移到1.8.0_66 - 替換棄用的Java JPEG類

error: package com.sun.image.codec.jpeg does not exist import com.sun.image.codec.jpeg.*; 

我參考了博客Replacing the deprecated Java JPEG classes for Java 7,我的錯誤已被清除。但現在我得到以下警告:

warning: JPEGImageWriter is internal proprietary API and may be removed in a future release import com.sun.imageio.plugins.jpeg.JPEGImageWriter; 

從博客有問題的代碼:

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(); 
} 
+1

由於您不應該使用內部API,因此您會收到警告 - 但這只是一個警告,您可以編譯並運行代碼。 – assylias

回答

4

在你的代碼有問題的行是:

JPEGImageWriter imageWriter = (JPEGImageWriter) ImageIO.getImageWritersBySuffix("jpeg").next(); 

有根本沒有必要對於此特定子類的投射和使用(JPEGImageWriter)。不依賴於特定的插件子類也是一個好習慣。在這種情況下,只需使用ImageWriter基類。

ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpeg").next(); 

其他所有工作都會像以前一樣運行。

注:在另一方面,JPEGImageWriteParam類,是公共APIjavax.imageio.plugins.jpeg包)的一部分,需要訪問特定的JPEG寫作的選項。這個用法完全沒問題。

+0

非常感謝。你讓我很容易修改。 – pankti