我想更改多页TIFF图像的高度,所以我在下面的代码段中进行缩放。但是它仅从tiff文件返回第一页,我想它会将其转换为JPEG图像。如何保留文件的所有页面?
public static byte[] scale(byte[] fileData, int width, int height) {
System.out.println("width:::"+width+"::::height:::"+height);
ByteArrayInputStream in = new ByteArrayInputStream(fileData);
ByteArrayOutputStream buffer=null;
BufferedImage img=null;
BufferedImage imageBuff=null;
try {
ImageInputStream imageStream = ImageIO.createImageInputStream(new ByteArrayInputStream(fileData));
java.util.Iterator<ImageReader> readers = ImageIO.getImageReaders(imageStream);
while(readers.hasNext()) {
ImageReader nextImageReader = readers.next();
nextImageReader.reset();
}
img = ImageIO.read(in);
if(height == 0) {
height = (width * img.getHeight())/ img.getWidth();
}
if(width == 0) {
width = (height * img.getWidth())/ img.getHeight();
}
Image scaledImage = img.getScaledInstance(width, height, Image.SCALE_SMOOTH);
imageBuff = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
imageBuff.getGraphics().drawImage(scaledImage, 0, 0, new Color(0,0,0), null);
buffer = new ByteArrayOutputStream();
ImageIO.write(imageBuff, "TIF", buffer);
} catch (IOException e) {
e.printStackTrace();
} finally{
if(img!=null){
img.flush();
img=null;
}
if(imageBuff!=null){
imageBuff.flush();
imageBuff=null;
}
if(buffer!=null){
try {
buffer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(in!=null){
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return buffer.toByteArray();
}
更新的代码:
public static byte[] resize(byte[] img,int height,int width) throws IOException {
byte[] outimage = null;
ImageReader reader=null;
ImageWriter writer=null;
ByteArrayOutputStream baos=null;
ImageOutputStream ios=null;
ImageInputStream imageStream=null;
try {
baos = new ByteArrayOutputStream(30000);
ios = ImageIO.createImageOutputStream(baos);
reader = getTiffImageReader();
imageStream= ImageIO.createImageInputStream(new ByteArrayInputStream(img));
reader.setInput(imageStream);
int pages = reader.getNumImages(true);
Iterator<ImageWriter> imageWriters = ImageIO.getImageWritersByFormatName("TIFF");
writer = imageWriters.next();
writer.setOutput(ios);
ImageWriteParam writeParam = writer.getDefaultWriteParam();
writeParam.setTilingMode(ImageWriteParam.MODE_DEFAULT);
writer.prepareWriteSequence(reader.getStreamMetadata());
for (int i = 0; i < pages; i++) {
//IIOImage iioImage = reader.readAll(i, null);
BufferedImage bufimage=null;
BufferedImage imageBuff=null;
bufimage=reader.read(i);
imageBuff=Thumbnails.of(bufimage).size(1200, 1200).asBufferedImage();
IIOImage scalediioImage = new IIOImage(imageBuff, null, null);
writer.writeToSequence(scalediioImage, writeParam);
bufimage.flush();
imageBuff.flush();
}
writer.endWriteSequence();
outimage = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
finally{
if(imageStream!=null){
imageStream.close();
}
if(ios!=null){
ios.flush();
ios.close();
}
if(baos!=null){
baos.close();
}
if(reader!=null){
reader.dispose();
}
if(writer!=null){
writer.dispose();
}
}
return outimage;
}
ImageIO.write(...)
只会写入单个独立映像。将多个图像写入同一输出流并不能解决此问题。但是,ImageIO软件包完全支持您所需的内容,只需要更多代码即可。
使用以下命令获取适用ImageWriter
于TIFF格式的格式:
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next(); // Assumes TIFF plugin installled
有关更多信息,请参见ImageIO.getImageWritersByFormatName(String)的API文档。
然后使用writer.canWriteSequence()
来告诉您的writer
实例是否支持编写序列。它
应该 返回true
TIFF。如果不是,则需要找到其他插件。
接下来,使用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;
}
我需要压缩一个有几个灰色16bit图像(多页)的tif文件。我已经尝试使用ImageIO如下所示:使用Java ImageIO进行Tiff压缩最初,tif文件中的每个图像都来自另一个Tiff文件。当我想使用压缩机时,我有以下选项: null
问题内容: 我有5张单页tiff图片。我想将所有这5张tiff图片合并为一张多页tiff图片。我正在使用Java Advanced Imaging API。我已经阅读了SUN提供的JAI API文档和教程。我是JAI的新手。我知道Java的基本核心。我不了解SUN提供的这些文档和资料。所以,朋友们请告诉我如何将5个tiff图像文件合并为一个多页tiff图像。请给我一些有关上述主题的指导。我一直在互
问题内容: 一直在撕我的头发。 如何将多页/多层TIFF图像分成几个单独的图像? 演示图像在这里。 (宁愿使用纯Java(即非本机)解决方案。该解决方案是否依赖于商业库也没关系。) 问题答案: 您可以使用 Java高级映像 库JAI通过使用ImageReader分割多页TIFF: 然后,您可以获得页面数: 并分别阅读页面:
我感兴趣的是拍摄一个tif图像,并在其中添加一个包含Java文本的层,如果可能的话,最好使用十二只猴子图像库。 我可以从这里调整代码以将文本添加到tif或仅使用文本创建相同大小的新tif,但不能将它们保存为多页tif。例如: Maven公司: 如何从图像和生成的文本图像创建多页tif? 我能够为JPG运行以下代码,但JPG没有层。 非常感谢。
问题内容: 改变的大小的图像在GWT部件改变所述图像元素的大小,但不重新调整屏幕上的图像。因此,以下操作将无效: 这是因为GWT 通过使用CSS 将HTML 元素的设置为图像来实现其Image小部件。 如何获得要调整尺寸的实际图像? 问题答案: 我看到了此博客条目,该条目通过使用GWT DataResource而不是ImageResource解决了问题。事实证明,如果您按以下方式使用它,则Imag