2

PNG形式のいくつかの画像のバイト配列があります。これを tiff ファイルに変換してから、対応するバイト配列に変換する必要があります。この tiff ファイルには複数の画像が含まれます。

私はたくさん検索しましたが、成功していません。キャッチはです。私はこれをJavaでのみ行う必要があります!! :)私の問題に関して誰かが洞察を提供できますか?

この変換を処理し、バックエンドに tiff として保存するサーバー コンポーネントがあるため、ImageMagick などのメリットはありません。クライアントは、png 画像に変換されるバイト配列を提供してくれます。

4

5 に答える 5

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

}
于 2010-09-14T07:59:06.610 に答える
2

これをプログラムで実行しようとしていますか?ImageMagick ( http://www.imagemagick.org/script/index.php )を参照してください。

ある種のシェル スクリプト (bash、バッチ) を作成している場合は、convertコマンド (そのパッケージの一部) を呼び出すことができます。それ以外の場合、ImageMagick のすべての機能は、ライブラリ (C、perl など) を介して利用できます。プログラムとのリンクを試すことができます。

于 2009-04-27T04:48:27.660 に答える
0

私はゴースト スクリプトを使用して複数ページの PDF ファイルを作成しましたが、似たようなことができるかもしれません。私の特定のアプリケーションには、複数ページの PDF を作成するために Windows で Ghostscript へのコマンド ライン呼び出しに渡した多数の JPG ファイルがありました。

これを行う場合、png ファイルをディスクに書き込むことから始めます。次に、ghostscript を使用して、すべての PNG ファイルを入力として受け取り、単一の PostScript ドキュメントに出力することにより、複数ページの ps ファイルを作成します。最後に、ps2tif などを使用して最終的な変換を行います。プログラムでバッチ スクリプトを記述してプロセスを自動化するか、アプリでコマンド ライン アプリを直接呼び出すことができます。

これはおそらく Unix/Linux 環境で行うのが最も簡単ですが、Win32 でも同じツールで実行できます。

于 2009-04-27T04:53:41.033 に答える