2016-01-21 3 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 класса с другой стороны, является частью общественного API (javax.imageio.plugins.jpeg пакета) и необходимо для доступа JPEG варианты конкретного письма. Это использование полностью в порядке.

+0

Большое спасибо. Вы сделали так легко изменить. – pankti