我目前正在使用下面的代码压缩TIFF图像到一个较小的JPG文件:Java的TIFF图像压缩与使用javax
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添加为原文 – user1806716
请注意'ImageIO.read()'可以返回'null'。 – kiheru