【问题标题】:How do I convert multiple png images to a single tiff file如何将多个 png 图像转换为单个 tiff 文件
【发布时间】:2010-10-21 23:48:28
【问题描述】:

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

我搜索了很多,但我没有成功。 问题是。我只需要在java中做到这一点! :) 任何人都可以就我的问题提供一些见解吗?

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

【问题讨论】:

  • 你提到你的问题是关于Java的;它应该以这种方式标记,并且(截至 2009 年 4 月 27 日)目前不是。我没有足够高的代表来自己做:-/
  • 我是新来的,我感觉很好

标签: java image png tiff


【解决方案1】:

以下是解决方案。

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;
 }

}

【讨论】:

    【解决方案2】:

    JMagick 库是 ImageMagick 的 Java 接口,很可能是您想要的。

    【讨论】:

      【解决方案3】:

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

      如果您正在编写某种类型的 shell 脚本(bash、批处理),您可以调用 convert 命令(这是该软件包的一部分。)否则,ImageMagick 的所有功能都可以通过库(C、 perl 等),您可以尝试将其与您的程序链接。

      【讨论】:

      • 我正在尝试在 java 程序中执行此操作,我确实找到了一种解决方案,但它仅转换单个物理文件。我在 png 格式中有一个字节数组。作为一个有令人发指的最后期限的新手,我不得不向你们寻求帮助。
      • 不确定您是否仍然需要帮助,但是:这些库可能能够处理字节数组,我不确定。否则,您可以将该字节数组写入文件,然后使用 ImageMagick 工具来操作该文件。
      【解决方案4】:

      我使用 ghostscript 创建多页 PDF 文件,您也许可以做类似的事情。我的特定应用程序有许多 JPG 文件,我将它们传递给 windows 上的 ghostscript 命令行调用以创建多页 PDF。

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

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

      【讨论】:

      • 这个问题我必须完全在 java 上完成
      【解决方案5】:

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

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

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

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

      【讨论】:

      • 我尝试使用 jai,但无法真正弄清楚如何将多个 png 写入 tiff 文件。我使用的是 java 1.5,lzard tiff 列出了与 java 1.1.3 兼容的下载,
      • 我使用 ImageDecoder d=ImageCodec.createImageDecoder("PNG",bytesfromfile,null) 创建了一个 png 解码器。另外,我正在尝试将其解码为渲染图像,最终出现错误,未找到 png 幻数....但它是我磁盘上的 png。
      • 可能是 Png 标头已损坏,或者它只有“.png”结尾,但它是另一种文件类型。尝试使用 GIMP 或 Photoship 来验证文件类型。在此线程中,您可以找到如何将多个文件合并到一个 TIFF 中。海报在更改 TIFF 元数据时遇到问题,但这不会影响您的问题。 forums.java.net/jive/thread.jspa?messageID=244190&tstart=0
      • 嗨哥们,实际上在从文件夹中检索所有 png 图像时,隐藏的 thumbs.db 文件也被拾取,因此出现错误。我花了 3 小时才知道.. rofl!现在,如果我有 10 个 png,我可以生成 10 个单独的 tiff 文件...我尝试使用 ImageWriter.write(bufferedImage,null,null) 如果它是第一页和 .writeInsert(pageindex,new IIOImage) 编写 tiff (buferedimage,null,null),null)...现在只写入第一个 tiff 图像,并在尝试追加时出现“抛出无效写入变体”的错误。有什么线索!!!!
      • java.lang.UnsupportedOperationException:不支持的写入变体!在 javax.imageio.ImageWriter.unsupported(Unknown Source) 在 javax.imageio.ImageWriter.writeInsert(Unknown Source) 在 ads.createTiff(ads.java:104) 在 ads.readfrompng(ads.java:58) 在 ads.main (ads.java:188)这是抛出的错误...我不知道要复制粘贴 ma 代码,我可以用你的电子邮件 ID 来做 :)
      猜你喜欢
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-01
      • 1970-01-01
      相关资源
      最近更新 更多