2009-04-27 25 views
2

私はpng形式でいくつかの画像のバイト配列を持っています。私はこれをTIFFファイルに変換し、対応するバイト配列に変換しなければなりません。このTIFFファイルには複数の画像が保存されます。複数のpng画像を1つのTIFFファイルに変換するには

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

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

+0

あなたの質問はJavaに関するものであると述べました。それはそのようにタグ付けされ、(2009年4月27日現在のように)現在はそうではありません。 Iそれを自分で行うのに十分に高い担当者を持っていない - 私は1つのソリューションを見つけた私はここの周りに新しい午前/ – bignose

+0

と私はJavaプログラムでこれを行うにしようとしています –

答えて

2

これをプログラム的に実行しようとしていますか?あなたはいくつかの並べ替え(bashの、バッチ)のシェルスクリプトを書いている場合は、convertコマンドを呼び出すことができますImageMagickの時(http://www.imagemagick.org/script/index.php

を見たいと思うかもしれません(そのパッケージの一部です。)それ以外の場合は、すべての機能をImageMagickはライブラリ(C、perlなど)を介して利用でき、あなたのプログラムとリンクすることができます。

+0

周りミリアンペアの道を感じて、 が、単一の物理ファイルのみを変換します。 私はPNG形式のforamtのbyte配列を持っています。そして驚くべき締め切りの初心者で、私は助けを求める人に頼る必要があります。 –

+0

これでも助けが必要なのかどうかはわかりませんが、これらのライブラリはバイト配列を処理できるかもしれませんが、わかりません。それ以外の場合は、バイト配列をファイルに書き込んだ後、ImageMagick機能を使用してそのファイルを操作できます。 – poundifdef

0

私はghostscriptを使用して複数ページのPDFファイルを作成していますが、同様のことをすることができます。私の特定のアプリケーションには、複数ページのPDFを作成するために、Windows上でghostscriptを呼び出すコマンドラインに渡されたいくつかのJPGファイルがありました。

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

これはおそらく、UNIX/Linux環境で行うのが最も簡単ですが、それは同じツールとWin32でなんとかです。

+0

私はこれをJava上で完全に行う必要があるという問題 –

3

JMagickライブラリはImageMagickへのJavaインターフェイスであり、あなたが望むものになる可能性があります。

0

JAI(Java Imaging API)を使用する必要があります。それはPNGの読み書きが可能で、少なくともTIFFを読むことができます(書き方もサポートする必要があります)。

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

書き込みは、このスレッドではジャワ(http://www.lizardworks.com/libs.html

のために使用リザードのTiffをライブラリにサポートされていない場合は、1つのTIFFに複数のファイルをマージする方法を見つけることができます。ポスターにはTIFFメタデータの変更に関する問題がありますが、問題には影響しません。以下は http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0

+0

私はjaiを使ってみましたが、複数のPNGをTIFFファイルに書き込む方法を実際に理解することができました.. 私はJava 1.5を使用しています。 with Java 1.1.3、 –

+0

私はImageDecoder d = ImageCodec.createImageDecoder( "PNG"、bytesfromfile、null)を使ってpngデコーダを作成しました。 また、私はそれをレンダリングされたイメージとしてデコードしようとしています。 最終的にはエラーが発生します.pngのマジックナンバーは見つかりませんでした....しかし、それは私のディスク上のpngです。 –

+0

おそらくPNGヘッダーが壊れているか、「.png」という文字列しかありませんが、別のファイルタイプです。 GIMPなどのPhotoshipを使用してファイルタイプを検証してみてください。 このスレッドでは、複数のファイルを1つのTIFFにマージする方法を見つけることができます。ポスターにはTIFFメタデータの変更に関する問題がありますが、問題には影響しません。 http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0 – HaBaLeS

3

ソリューションです。

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

} 
関連する問題