【问题标题】:Replacing deprecated Sun packages Converting Tiff To Jpeg替换已弃用的 Sun 软件包将 Tiff 转换为 Jpeg
【发布时间】:2021-12-02 17:39:32
【问题描述】:

我们有一段旧代码,它仍然使用 Sun JAI API 从 tiff 文件创建 jpeg

 private File createJPEG(String tifFilePath){

    FileOutputStream fos = null;
    SeekableStream s = null;

    try {

      s = new FileSeekableStream(tifFilePath);
      TIFFDecodeParam param = null;
      ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
      RenderedImage op = dec.decodeAsRenderedImage(0);

      File jpgFile = new File(tifFilePath.replace("tif","jpg"));
      fos = new FileOutputStream(jpgFile);

      JPEGEncodeParam jpgparam = new JPEGEncodeParam();
      jpgparam.setQuality(67);

      ImageEncoder en = ImageCodec.createImageEncoder("jpeg", fos, jpgparam);
      en.encode(op);
      fos.flush();
    }catch (IOException ex){
      LOGGER.error(ex);
    }finally {
      if(fos != null) {
        try {
          fos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      if(s != null){
        try {
          s.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
    }
    return null;
  }

现在,对于具有较新 Java 版本的系统,这不再适用,运行此代码时出现错误 noclassdeffounderror com/sun/image/codec/jpeg/jpegcodec

这些是进口:

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.JPEGEncodeParam;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFDecodeParam;
import com.sun.media.jai.codec.TIFFEncodeParam;

现在我知道你不应该再使用 com.sun 包了,我得到的这个错误是因为 JPEGCodec 在我们在新系统中使用的 Java 运行时不再存在。但是如何替换这些导入?

【问题讨论】:

标签: java spring jvm jai


【解决方案1】:

上面的代码应该很简单直接移植到ImageIO

我将变量名保留在我认为合理的范围内,以使其更易于理解,并重写为使用 try-with-resources。我相信这应该可行:

private File createJPEG(String tifFilePath) {
    try (ImageInputStream s = ImageIO.createImageInputStream(new File(tifFilePath))) {
        Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("TIFF"); // Could also use ImageIO.getImageReaders(s) to support any input format
        if (!readers.hasNext()) {
            return null; // ...or throw new IllegalArgumentException or similar
        }

        ImageReader dec = readers.next();
        dec.setInput(s);

        // The above code doesn't seem to use param, but if needed that is also possible
        ImageReadParam param = null; // dec.getDefaultReadParam() or new TIFFImageReadParam()
        RenderedImage op = dec.readAsRenderedImage(0, param); // Could als use dec.read(0, param) in most cases 
        
        File jpgFile = new File(tifFilePath.replace("tif", "jpg"));

        try (ImageOutputStream fos = ImageIO.createImageOutputStream(jpgFile)) {
            JPEGImageWriteParam jpgparam = new JPEGImageWriteParam(Locale.getDefault());
            jpgparam.setCompressionMode(MODE_EXPLICIT);
            jpgparam.setCompressionQuality(0.67f); // You might want to tune this parameter to get same quality/compression ratio as JAI

            ImageWriter en = ImageIO.getImageWritersByFormatName("JPEG").next();
            en.setOutput(fos);
            en.write(null, new IIOImage(op, null, null), jpgparam);
        }
    } catch (IOException ex) {
        LOGGER.error(ex);
    }

    return null; // What the original code does, probably you want to return jpgFile?
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    相关资源
    最近更新 更多