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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/792255/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-29 13:48:37  来源:igfitidea点击:

How do I convert multiple png images to a single tiff file

javaimagepngtiff

提问by bignose

I have a byte array of several images in the png format. I have to convert this to a tiff file and then into the corresponding byte array. This tiff file will hold multiple images.

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

I have searced a lot, but I haven't been successful. The catch is. i have to do this in java only!! :) Can anyone provide some insight as regards my issue?

我已经烧了很多,但我还没有成功。问题是。我只需要在 Java 中执行此操作!!:) 任何人都可以就我的问题提供一些见解吗?

I wont benefit from ImageMagick etc, because i have a server component that handles this conversion, and then saves it in the backend as a tiff. The client gies me a byte array which would translate into a png image.

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

回答by Arvind Jajoo

Below is the solution.

下面是解决方法。

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

}

回答by bignose

The JMagicklibrary is a Java interface to ImageMagick, and is likely to be what you want.

JMagick库是一个Java接口,以ImageMagick的,并且很可能是你想要的。

回答by poundifdef

Are you trying to do this programatically? You might want to look at ImageMagick (http://www.imagemagick.org/script/index.php)

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

If you are writing a shell script of some sort (bash, batch) you can invoke the convertcommand (which is part of that package.) Otherwise, all of the functionality of ImageMagick is available through libraries (C, perl, etc) which you can try linking in with your program.

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

回答by Al Crowley

I've used ghostscript to create multi-page PDF files, you might be able to do something similar. My particular application had a number of JPG files that I passed to a command line call to ghostscript on windows to create a multi-page PDF.

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

If I were doing this, I would start by writing the png files to disk. Next use ghostscript to create a multi-page ps file by taking all the PNG files as input, and outputing to a sinlge PostScript document. Finally, use something like ps2tif to do the final conversion. You could either automate the process by programmatically writing out a batch script or just having your app call the command line apps directly.

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

This is probably easiest to do in a Unix/Linux environment, but it's doable on Win32 with the same tools.

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

回答by HaBaLeS

You should use the JAI (Java Imaging API). It is capable of reading/writing PNG's and at least capable of reading TIFF (writing should be supported too).

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

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

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

If writing is not supported use Lizard's Tiff Library for Java (http://www.lizardworks.com/libs.html)

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

In this thread you can find how to merge multiple files into one TIFF. The poster has Problems changing the TIFF metadata but this should not affect your Problem. http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0

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