简体   繁体   English

使用Javax的Java Tiff图像压缩

[英]Java Tiff Image Compression with javax

I am currently trying to compress a tiff image into a smaller jpg file using the following code: 我目前正在尝试使用以下代码将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();
        }
    }

Even though I can get it to successfully read the source tif into the buffer, it still throws the following error: 即使可以成功将源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)

At the line: 在此行:

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

How is the image reporting itself as null even though it isnt? 即使图像本身不是null,该如何将其报告为null?

I suspect the call to ImageIO.read(srcInStream); 我怀疑调用ImageIO.read(srcInStream); is returning null (indicating that you have no registered ImageReader for TIFF). 返回null(表明您没有为TIFF注册ImageReader)。 How do you know that you successfully read the image? 您如何知道您已成功读取图像?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM