如何将多个png图像转换为单个tiff文件

时间:2009-04-27 04:39:16

标签: java image png tiff

我有一个png格式的几个图像的字节数组。我必须将其转换为tiff文件,然后转换为相应的字节数组。这个tiff文件将保存多个图像。

我已经接受了很多,但我没有成功。 问题是。我只能在java中这样做!! :) 任何人都可以就我的问题提供一些见解吗?

我不会受益于ImageMagick等,因为我有一个处理此转换的服务器组件,然后将其作为tiff保存在后端。 客户端给我一个字节数组,它将转换成一个png图像。

5 个答案:

答案 0 :(得分:4)

以下是解决方案。

import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.IIOImage;
import javax.imageio.ImageWriteParam;
import javax.imageio.stream.ImageOutputStream;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Iterator;

/**
 * 
 * 
 * This class is used to convert the multiple images in to single multi-pages tiff image file.
 *
 */
public class MultiPageTiffGenerator {

 private static String compressionType="JPEG";

 public static boolean generateMultiPageTiff(String dirName,String outputFileName) throws Exception{
  boolean generated=false;
  ImageOutputStream ios=null;
  ImageWriter writer=null;
  try {
   // verify the directory for the image files
   File dir = new File(dirName);
   if(null!=dir && !dir.isDirectory()){
    throw new FileNotFoundException("No directory exists with the given name"+dirName);
   }
   // verify the images files exist

   File[] files = dir.listFiles();
   if(null == files || files.length == 0){
    throw new FileNotFoundException("No image files to process");

   }else{
    // Create the output file on the disk
    File file = new File(dirName+outputFileName+".tif");
    ios = ImageIO.createImageOutputStream(file);

    // Get the appropriate Tiff Image Writer
    Iterator <ImageWriter> writers=ImageIO.getImageWritersByFormatName("tiff");
    if(null== writers || ! writers.hasNext()){
     throw new Exception("Appropriate Tiff writer not found");
    }

    writer = ImageIO.getImageWritersByFormatName("tiff").next();
    writer.setOutput(ios);
    // Set the compression parameters for Tiff image
    ImageWriteParam param = writer.getDefaultWriteParam();
    //param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    //param.setCompressionType(compressionType); 
    //param.setCompressionQuality(0.9F);

    // Loop through all image files and write them to output tiff image
    for (int i = 0; i < files.length; i++) {
     InputStream fis=null;
     int dotIndex= files[i].getName().lastIndexOf('.');
     dotIndex=dotIndex>0?dotIndex:files[i].getName().length();
     String fileName = files[i].getName().substring(0,dotIndex);
     if(!fileName.equalsIgnoreCase(outputFileName)){
      try{

       fis = new BufferedInputStream(new FileInputStream(files[i]));
       BufferedImage image = ImageIO.read(fis);
       IIOImage img = new IIOImage(image, null, null);
       if (i == 0) {
        writer.write(null, img, param);
       }
       else {
        writer.writeInsert(-1, img, param);
       }
       image.flush();
      }finally{
       if(null!=fis){
        fis.close();
       }
      }
     }

    }
    ios.flush();
    generated=true;

   }

  }catch(FileNotFoundException ex){
   generated=false;
  }catch(IOException ex){
   generated=false;
  }catch(Exception ex){
   generated=false;
  }finally{
   if(null!=ios)
    ios.close();
   if(null!=writer)
    writer.dispose();
  }
  return generated;
 }

}

答案 1 :(得分:3)

JMagick库是ImageMagick的 Java接口,可能就是你想要的。

答案 2 :(得分:2)

您是否正在尝试以编程方式执行此操作?您可能想要查看ImageMagick(http://www.imagemagick.org/script/index.php

如果你正在编写某种shell脚本(bash,batch),你可以调用convert命令(它是该软件包的一部分。)否则,ImageMagick的所有功能都可以通过库获得( C,perl等,你可以尝试链接你的程序。

答案 3 :(得分:0)

我使用ghostscript创建多页PDF文件,你可以做类似的事情。我的特定应用程序有一些JPG文件,我在Windows上命令行调用ghostscript来创建一个多页PDF。

如果我这样做,我会先将png文件写入磁盘。接下来使用ghostscript创建一个多页ps文件,将所有PNG文件作为输入,并输出到sinlge PostScript文档。最后,使用ps2tif之类的东西进行最终转换。您可以通过以编程方式编写批处理脚本或让应用程序直接调用命令行应用程序来自动执行该过程。

在Unix / Linux环境中这可能是最容易做到的,但在Win32上使用相同的工具是可行的。

答案 4 :(得分:0)

您应该使用JAI(Java Imaging API)。它能够读/写PNG并且至少能够读取TIFF(也应该支持写入)。

http://java.sun.com/products/java-media/jai/iio.html

如果不支持写作,请使用Lizard的Tiff Library for Java(http://www.lizardworks.com/libs.html

在此主题中,您可以找到如何将多个文件合并为一个TIFF。海报有问题更改TIFF元数据但这不应该影响您的问题。 http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0