Как преобразовать несколько изображений PNG в один файл TIFF - PullRequest
2 голосов
/ 27 апреля 2009

У меня есть байтовый массив из нескольких изображений в формате png. Я должен преобразовать это в файл TIFF, а затем в соответствующий массив байтов. Этот TIFF-файл будет содержать несколько изображений.

Я много искал, но не увенчался успехом. Подвох есть. Я должен сделать это только в Java! :) Кто-нибудь может рассказать о моей проблеме?

Я не получу выгоду от ImageMagick и т. Д., Потому что у меня есть серверный компонент, который обрабатывает это преобразование, а затем сохраняет его в серверной части в виде tiff. Клиент предоставляет мне байтовый массив, который будет преобразован в изображение PNG.

Ответы [ 5 ]

4 голосов
/ 14 сентября 2010

Ниже приведено решение.

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

}
3 голосов
/ 27 апреля 2009

Библиотека JMagick является Java-интерфейсом для ImageMagick и, вероятно, будет тем, что вам нужно.

2 голосов
/ 27 апреля 2009

Вы пытаетесь сделать это программно? Возможно, вы захотите взглянуть на ImageMagick (http://www.imagemagick.org/script/index.php)

Если вы пишете какой-то сценарий оболочки (bash, batch), вы можете вызвать команду convert (которая входит в этот пакет). В противном случае все функции ImageMagick доступны через библиотеки (C, Perl и т. д.), который вы можете попробовать связать с вашей программой.

0 голосов
/ 27 апреля 2009

Вы должны использовать JAI (API Java Imaging). Он способен читать / писать PNG и, по крайней мере, способен читать TIFF (запись также должна поддерживаться).

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

Если запись не поддерживается, используйте библиотеку Tiff Lizard для Java (http://www.lizardworks.com/libs.html)

В этой теме вы можете найти, как объединить несколько файлов в один TIFF. На постере есть Проблемы с изменением метаданных TIFF, но это не должно повлиять на вашу Проблему. http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0

0 голосов
/ 27 апреля 2009

Я использовал ghostscript для создания многостраничных файлов PDF, возможно, вы сможете сделать что-то подобное. В моем конкретном приложении было несколько файлов JPG, которые я передал в командной строке в ghostscript для создания многостраничного PDF.

Если бы я делал это, я бы начал с записи файлов png на диск. Затем используйте ghostscript, чтобы создать многостраничный ps-файл, взяв все PNG-файлы в качестве входных данных и выгрузив их в отдельный документ PostScript. Наконец, используйте что-то вроде ps2tif для окончательного преобразования. Вы можете либо автоматизировать процесс, программно выписав пакетный скрипт, либо просто заставив ваше приложение напрямую вызывать приложения командной строки.

Это, вероятно, проще всего сделать в среде Unix / Linux, но это возможно на Win32 с теми же инструментами.

...