【问题标题】:Java Tiff Image Compression with javax使用 javax 进行 Java Tiff 图像压缩
【发布时间】:2013-10-17 01:21:07
【问题描述】:

我目前正在尝试使用以下代码将 tiff 图像压缩为较小的 jpg 文件:

 public ImageHandler(String srcPath, String destPath, float qual) throws IOException{
    this.pathToSourceImage = srcPath;
    this.pathToDestImage = destPath;
    this.quality = qual;
    this.sourceImage = new File(pathToSourceImage);
    this.destImage = new File(pathToDestImage);
    this.srcInStream = new FileInputStream(sourceImage);
    this.destOutStream = new FileOutputStream(destImage);
}

private void compress() throws IOException{
        BufferedImage image = ImageIO.read(srcInStream);
        System.out.println("Got the bufferedImage");
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");

        if(!writers.hasNext()){
            throw new IllegalStateException("No Writers Found!");
        }

        ImageWriter writer = (ImageWriter) writers.next();
        ImageOutputStream imageOutStream = ImageIO.createImageOutputStream(destOutStream);
        writer.setOutput(imageOutStream);

        ImageWriteParam param = writer.getDefaultWriteParam();

        //Compress at quality
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(quality);

        writer.write(null, new IIOImage(image, null, null), param);

        srcInStream.close();
        destOutStream.close();
        imageOutStream.close();
        writer.dispose();


    }


 public static void main(String args[]){
        String tifPath = "C:\\00000000.090.tif";
        String compressedJpgPath = "C:\\compressed.jpg";
        float quality = 0.5f;

        try{
            ImageHandler testHandler = new ImageHandler(tifPath, compressedJpgPath, quality);
            testHandler.compress();
        }catch(IOException e){
            e.printStackTrace();
        }
    }

即使我可以让它成功地将源 tif 读入缓冲区,它仍然会抛出以下错误:

Exception in thread "main" java.lang.IllegalArgumentException: image == null!
at javax.imageio.IIOImage.<init>(IIOImage.java:109)
at fjimagecompressor.ImageHandler.compress(ImageHandler.java:82)
at fjimagecompressor.ImageHandler.main(ImageHandler.java:99)

在线:

writer.write(null, new IIOImage(image, null, null), param);

图像如何将自己报告为 null,即使它不是?

【问题讨论】:

  • 你有完整的堆栈跟踪吗?
  • @mattforsythe 添加到原帖
  • 注意ImageIO.read()可以返回null

标签: java javax.imageio


【解决方案1】:

我怀疑对 ImageIO.read(srcInStream); 的调用返回 null(表明您没有为 TIFF 注册的 ImageReader)。你怎么知道你成功读取了图片?

【讨论】:

  • 我认为 ImageIO 内置了一个用于 tiff 的注册图像阅读器?或者您是说我需要为 TIFF 图像阅读器下载其他外部 api 吗?
  • 它似乎没有开箱即用的注册 ImageReader。 (当我打电话给ImageIO.getImageReadersByFormatName("TIFF") 时,我得到了一个空的迭代器。)你可能需要第三者的东西。我认为 TIFF 存在许可问题。
  • @user1806716 这回答了你的问题吗?
  • @user1806716 如果您认为我的回答是正确的,请您投票/接受它作为正确答案吗?
猜你喜欢
  • 2010-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多