2009-04-27 2 views
2

Ich habe ein Byte-Array von mehreren Bildern im PNG-Format. Ich muss dies in eine TIFF-Datei und dann in das entsprechende Byte-Array konvertieren. Diese TIFF-Datei enthält mehrere Bilder.Wie konvertiere ich mehrere PNG-Bilder in eine einzige TIFF-Datei

Ich habe viel gesucht, aber ich war nicht erfolgreich. Der Haken ist. Ich muss das nur in Java machen !! :) Kann mir jemand einen Einblick in mein Problem geben?

Ich werde nicht von ImageMagick usw. profitieren, weil ich eine Serverkomponente habe, die diese Konvertierung handhabt und sie dann im Backend als Tiff speichert. Der Client lieferte mir ein Byte-Array, das in ein PNG-Bild übersetzt werden würde.

+0

Sie haben erwähnt, dass Ihre Frage speziell Java betrifft; es sollte auf diese Weise getaggt werden und (wie am 2009-04-27) ist es derzeit nicht. Ich habe keine Rep hoch genug, um es selbst zu tun: -/ – bignose

+0

Ich bin neu hier und ich fühle mich ma Weg herum –

Antwort

2

Versuchen Sie dies programmatisch zu tun? Sie könnten bei ImageMagick (http://www.imagemagick.org/script/index.php)

aussehen wollen Wenn Sie ein Shell-Skript von einer Art (bash, Batch-) schreiben Sie den convert Befehl aufrufen können (die Teil des Pakets ist.) Ansonsten die gesamte Funktionalität von ImageMagick ist über Bibliotheken (C, Perl, etc) verfügbar, die Sie versuchen können, mit Ihrem Programm zu verknüpfen.

+0

Ich versuche, dies in einem Java-Programm zu tun, Ich habe eine Lösung gefunden, aber Es konvertiert nur eine einzelne physische Datei. Ich habe ein Byte-Array in der Png foramt.und ein Neuling mit unerhörter Frist, ich muss mich an euch um Hilfe wenden. –

+0

Nicht sicher, ob Sie immer noch Hilfe benötigen, aber: diese Bibliotheken können möglicherweise Bytearrays verarbeiten, ich bin mir nicht sicher. Andernfalls können Sie dieses Byte-Array in eine Datei schreiben und dann mithilfe der ImageMagick-Funktionen diese Datei bearbeiten. – poundifdef

0

Ich habe Ghostscript verwendet, um mehrseitige PDF-Dateien zu erstellen, möglicherweise können Sie etwas ähnliches tun. Meine bestimmte Anwendung hatte eine Reihe von JPG-Dateien, die ich an einen Befehlszeilenaufruf zu Ghostscript in Windows übergab, um eine mehrseitige PDF zu erstellen.

Wenn ich dies tun würde, würde ich beginnen, indem Sie die PNG-Dateien auf die Festplatte schreiben. Verwenden Sie als Nächstes ghostscript, um eine mehrseitige ps-Datei zu erstellen, indem Sie alle PNG-Dateien als Eingabe nehmen und in ein einzelnes PostScript-Dokument ausgeben. Schließlich verwenden Sie etwas wie ps2tif, um die endgültige Konvertierung durchzuführen. Sie können den Prozess entweder automatisieren, indem Sie programmgesteuert ein Batch-Skript schreiben oder wenn Ihre App die Befehlszeilen-Apps direkt aufruft.

Dies ist wahrscheinlich am einfachsten in einer Unix/Linux-Umgebung, aber es ist mit den gleichen Tools auf Win32 machbar.

+0

das Problem, ich muss dies vollständig auf Java –

3

Die JMagick-Bibliothek ist eine Java-Schnittstelle zu ImageMagick, und ist wahrscheinlich, was Sie wollen.

0

Sie sollten die JAI (Java Imaging API) verwenden. Es ist in der Lage, PNGs zu lesen/schreiben und zumindest TIFF zu lesen (das Schreiben sollte ebenfalls unterstützt werden).

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

Wenn das Schreiben nicht Gebrauch Lizard Tiff-Bibliothek für Java (http://www.lizardworks.com/libs.html)

In diesem Thread unterstützt wird können Sie finden, wie mehrere Dateien in eine TIFF verschmelzen. Das Poster hat Probleme beim Ändern der TIFF-Metadaten, dies sollte jedoch keine Auswirkungen auf Ihr Problem haben. http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0

+0

Ich versuchte mit Jai, aber konnte nicht wirklich herausfinden, wie man mehrere PNGs in eine TIFF-Datei schreiben .. Ich benutze Java 1.5, und die lzard Tiff listet Downloads kompatibel mit Java 1.1.3, –

+0

Ich benutzte den ImageDecoder d = ImageCodec.createImageDecoder ("PNG", Bytesfromfile, null), um einen PNG-Decoder zu erstellen. auch, ich versuche, es als gerenderten Bild zu decodieren, schließlich bekomme ich einen Fehler, png magische Zahl nicht gefunden .... Aber es ist ein PNG auf meiner Festplatte. –

+0

Vielleicht ist der Png-Header beschädigt oder hat nur die Endung ".png", ist aber ein anderer Dateityp. Verwenden Sie GIMP oder Photoship, um den Dateityp zu validieren. In diesem Thread finden Sie, wie Sie mehrere Dateien in einem TIFF zusammenführen. Das Poster hat Probleme beim Ändern der TIFF-Metadaten, dies sollte jedoch keine Auswirkungen auf Ihr Problem haben. http://forums.java.net/jive/thread.jspa?messageID=244190&tstart=0 – HaBaLeS

3

Unten ist die Lösung.

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

} 
Verwandte Themen