Java 使用ImageIO编写带有层(即分解级别)的JPEG 2000
好,这是我们的问题: 我们正在尝试使用imageio将一系列黑白.tiff文件转换为jpeg2000.jpf文件。我们总是得到可查看的.jpf文件,但它们通常没有用于缩放的指定层数或分解级别 这是我们的代码:Java 使用ImageIO编写带有层(即分解级别)的JPEG 2000,java,javax.imageio,jpeg2000,Java,Javax.imageio,Jpeg2000,好,这是我们的问题: 我们正在尝试使用imageio将一系列黑白.tiff文件转换为jpeg2000.jpf文件。我们总是得到可查看的.jpf文件,但它们通常没有用于缩放的指定层数或分解级别 这是我们的代码: //Get the tiff reader Iterator<ImageReader> readerIterator = ImageIO.getImageReadersByFormatName("tiff"); ImageReader tiffreader = reade
//Get the tiff reader
Iterator<ImageReader> readerIterator = ImageIO.getImageReadersByFormatName("tiff");
ImageReader tiffreader = readerIterator.next();
//make an ImageInputStream from our tiff file and have the tiff reader read it
ImageInputStream iis = ImageIO.createImageInputStream(itemFile);
tiffreader.setInput(iis);
//just pass empty params to the tiff reader
ImageReadParam tparam;
tparam = new TIFFImageReadParam();
IIOImage img = tiffreader.readAll(0, tparam);
//set up target file
File f = new File(itemTargetDirectory.getAbsolutePath() + "/" + destFileName);
//we have tried FILTER_97 as well as different ProgressionTypes and compression settings
J2KImageWriteParam param;
param = new J2KImageWriteParam();
param.setProgressionType("layer");
param.setFilter(J2KImageWriteParam.FILTER_53);
//Our problem is that this param is not always respected in the resulting .jpf
param.setNumDecompositionLevels(5);
//get the JPEG 2000 writer
Iterator<ImageWriter> writerIterator = ImageIO.getImageWritersByFormatName("JPEG 2000");
J2KImageWriter jp2kwriter = null;
jp2kwriter = (J2KImageWriter) writerIterator.next();
//write the jpf file
ImageOutputStream ios = ImageIO.createImageOutputStream(f);
jp2kwriter.setOutput(ios);
jp2kwriter.write(null, img, param);
//获取tiff读取器
迭代器readerIterator=ImageIO.GetImageReaderByFormatName(“tiff”);
ImageReader tiffreader=ReaderInterator.next();
//从tiff文件生成ImageInputStream,并让tiff读取器读取它
ImageInputStream iis=ImageIO.CreateMageInputStream(itemFile);
tiffreader.setInput(iis);
//只需将空参数传递给tiff读取器
ImageReadParam-tparam;
tparam=新的TIFFImageReadParam();
IIOImage img=tiffreader.readAll(0,tparam);
//设置目标文件
文件f=新文件(itemTargetDirectory.getAbsolutePath()+“/”+destFileName);
//我们尝试了FILTER_97以及不同的ProgressionType和压缩设置
J2KImageWriteParam参数;
param=新的J2KImageWriteParam();
参数setProgressionType(“层”);
参数设置过滤器(J2KImageWriteParam.FILTER_53);
//我们的问题是,这个参数在生成的.jpf中并不总是受到尊重
参数SetNumDeCompositionLevel(5);
//获取JPEG2000编写器
迭代器writerator=ImageIO.getImageWritersByFormatName(“JPEG 2000”);
J2KImageWriter jp2kwriter=null;
jp2kwriter=(J2KImageWriter)writerator.next();
//编写jpf文件
ImageOutputStream ios=ImageIO.createImageOutputStream(f);
jp2kwriter.setOutput(ios);
jp2kwriter.write(null,img,param);
这是一种奇怪的体验,因为相同的代码在后续运行中表现不同。
任何见解将不胜感激 所有TIFF文件是否具有相同的设置(颜色模型)?显示当索引颜色或多像素压缩源图像用作输入时,分解级别设置(强制)为零 Drew走上了正确的道路,下面是最终为我们解决问题的代码:
public void compressor(String inputFile, String outputFile) throws IOException {
J2KImageWriteParam iwp = new J2KImageWriteParam();
FileInputStream fis = new FileInputStream(new File(inputFile));
BufferedImage image = ImageIO.read(fis);
fis.close();
if (image == null)
{
System.out.println("If no registered ImageReader claims to be able to read the resulting stream");
}
Iterator writers = ImageIO.getImageWritersByFormatName("JPEG2000");
String name = null;
ImageWriter writer = null;
while (name != "com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriter") {
writer = (ImageWriter) writers.next();
name = writer.getClass().getName();
System.out.println(name);
}
File f = new File(outputFile);
long s = System.currentTimeMillis();
ImageOutputStream ios = ImageIO.createImageOutputStream(f);
writer.setOutput(ios);
J2KImageWriteParam param = (J2KImageWriteParam) writer.getDefaultWriteParam();
IIOImage ioimage = new IIOImage(image, null, null);
param.setSOP(true);
param.setWriteCodeStreamOnly(true);
param.setProgressionType("layer");
param.setLossless(false);
param.setCompressionMode(J2KImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("JPEG2000");
param.setCompressionQuality(0.1f);
param.setEncodingRate(1.01);
param.setFilter(J2KImageWriteParam.FILTER_97);
writer.write(null, ioimage, param);
System.out.println(System.currentTimeMillis() - s);
writer.dispose();
ios.flush();
ios.close();
image.flush();
}
有多少读卡器返回ImageIO.getImageReadersByFormatName(“tiff”);方法?有多少写入程序返回ImageIO.getImageWritersByFormatName(“JPEG 2000”);方法?是否可能每次执行都会得到不同的读写器?@Fedy2 ImageIO返回的读写器顺序应该是稳定的。但是,最好确定case.sample文件是否真的存在?//我们的问题是,这个参数(numdeCompositionLevel)并不总是在生成的.jpf中得到尊重。当不考虑分解级别5时,在生成的图像中会得到多少级别?