ImageIO.write(...)只会写入单个独立映像。将多个图像写入同一输出流并不能解决此问题。但是,ImageIO软件包完全支持您所需的内容,只需要更多代码即可。
使用以下命令获取适用
ImageWriter于TIFF格式的格式:
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next(); // Assumes TIFF plugin installled有关更多信息,请参见ImageIO.getImageWritersByFormatName(String)的API文档。
然后使用
writer.canWriteSequence()来告诉您的
writer实例是否支持编写序列。它
应该 返回
trueTIFF。如果不是,则需要找到其他插件。
接下来,使用
writer.prepareWriteSequence(...)准备图像序列。
对于要附加的每个图像(页),使用
writer.writeToSequence(new IIOImage(..., bufferedImage,null),...)的
for循环。
然后最后, 外部
的
for环使用
writer.endWriteSequence()以结束图像序列。
希望这些指针能使您朝正确的方向前进。
更新:这是我 认为 应该工作的代码的经过清理和修改的版本(我没有,也不能在我的笔记本电脑上安装JAI)。
重要的更改是
writer.setOutput(ios)从循环中删除(只需设置一次),然后将
writer.endWriteSequence()循环移开。我还删除了该
BufferedImage数组,以避免将所有图像保留在内存中,为方便起见,可能需要保留它。
如果您仍然遇到问题,请告诉我,我会解决的。
public static byte[] resize(byte[] img) throws IOException { byte[] outimage = null; try { ByteArrayOutputStream baos = new ByteArrayOutputStream(30000); ImageOutputStream ios = ImageIO.createImageOutputStream(baos); ImageReader reader = getTiffImageReader(); ImageInputStream imageStream = ImageIO.createImageInputStream(new ByteArrayInputStream(img)); reader.setInput(imageStream); int pages = reader.getNumImages(true); Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("TIFF"); ImageWriter writer = imageWriters.next(); writer.setOutput(ios); ImageWriteParam writeParam = writer.getDefaultWriteParam(); writeParam.setTilingMode(ImageWriteParam.MODE_DEFAULT); writer.prepareWriteSequence(reader.getStreammetadata()); // You want the stream metadata here for (int i = 0; i < pages; i++) { IIOImage iioImage = reader.readAll(i, null); // Save some lines by using readAll BufferedImage image = (BufferedImage) iioImage.getRenderedImage(); // Modify image here... iioImage.setRenderedImage(image); writer.writeToSequence(iioImage, writeParam); } writer.endWriteSequence(); // Crucial, must be done outside loop ios.flush(); ios.close(); outimage = baos.toByteArray(); baos.close(); writer.dispose(); reader.dispose(); } catch (Exception e) { e.printStackTrace(); } return outimage;}


