TIFF nach BufferedImage wandeln

Status
Nicht offen für weitere Antworten.

reibi

Top Contributor
@kaie

Jep, hab ich schon ausprobiert. Das Problem ist das es mir nur ein RenderedImage liefert. Ich brauche aber ein BufferedImage.
 

reibi

Top Contributor
Also wie das in nen Outputstream geht weiss ich. Nur Wie schreib ichs dann wiederum in das BufferedImage?
 
G

Guest

Gast
Was funktioniert denn bitte nicht, wenn Du es einfach auf ein neues BufferedImage draufzeichnest?
Code:
public BufferedImage wandleBild( Image i )
{
  BufferedImage bi = new BufferedImage( i.getWidth(null), i.getHeight(null), BufferedImage.TYPE_INT_RGB );
  bi.getGraphics().drawImage(i,0,0,null);
  return bi;
}
Ich fürchte, ich versteh das Problem immer noch nicht... :bahnhof:
 

reibi

Top Contributor
Lieber Gast: Ich kann Doch nicht draufzeichnen, da ich nichts habe was nicht wenigstens ein Image ist!!! Ich habe lediglich ein RenderedImage und dieses ist nicht vom Typ Image!!
 

kaie

Bekanntes Mitglied
Das folgende Beispiel funktioniert bei mir ohne Probleme - nur leider habe ich nur TIFFs mit einer Seite. Kannst Du nicht mal Deine Datei zum Testen zur Verfügung stellen? Probier mal, ob das Laden hiermit klappt:

Code:
import java.awt.image.*;
import java.io.*;

import javax.media.jai.*;
import javax.swing.*;

import com.sun.media.jai.codec.*;

public class TifConverter
{
    public static void main(String[] args) throws Exception
    {
        BufferedImage bi = holeSeite("c:/test.tif",0);
        JFrame f = new JFrame();
        f.add(new JButton(new ImageIcon(bi)));
        f.pack();
        f.setVisible(true);
    }

    public static BufferedImage holeSeite( String dateiname, int seite ) throws Exception
    {
        SeekableStream s = new FileSeekableStream( new File(dateiname) );
        ImageDecoder d = ImageCodec.createImageDecoder("tiff", s, null);
        System.out.println("Anzahl Seiten: "+ d.getNumPages());
        RenderedImage op = new NullOpImage(d
                .decodeAsRenderedImage(seite), null, OpImage.OP_IO_BOUND,
                null);
        BufferedImage bi = new BufferedImage(op.getWidth(),op.getHeight(),BufferedImage.TYPE_INT_RGB);
        op.copyData(bi.getRaster());
        return bi;
    }
}
 

thE_29

Top Contributor
@reibi: man hat auf der Sun Seite ja auch ein eigenes Installding für Linux und da sind .so (sind dlls für Linux) dabei!

Aber vielleicht gehts auch ohne!

Desweiteren wenn man Bytes hat kann man sich ja ein Bild via dem Toolkit (schon vergessen, steht vor 2 Seiten?!) erstellen lassen!

Toolkit.createImage(byte[]);
 

reibi

Top Contributor
@kaie

Habs eins zu eins kopiert! ---> GEHT NICHT!

er wirf das hier

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
at com.sun.media.jai.util.ImageUtil.copyRaster(ImageUtil.java:274)
at javax.media.jai.PlanarImage.copyData(PlanarImage.java:2350)
at TifConverter.holeSeite(TifConverter.java:33)
at TifConverter.main(TifConverter.java:15)

bei dem hier: op.copyData(bi.getRaster());

Langsam zweifel ich an mir selbst! Ich hätte doch lieber Förster werden sollen! ;-)
 

reibi

Top Contributor
@thE_29: mir kommt da noch ne Idee mit deinem:

Toolkit.createImage(byte[]);

und so 2 sachen: 4 Seiten vorher...

und

@Alle : Danke das Ihr Euch alle meinem Problem annehmt. ;-)
 

KSG9|sebastian

Top Contributor
Code:
import java.awt.BorderLayout;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.SeekableStream;


public class Test extends JFrame {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 2036333296087078136L;


	public Test() throws IOException {
		super("TIFF Example");
		super.setBounds(0, 0, 500, 500);
		BufferedImage bimg = getImage(1);
		JLabel jl = new JLabel();
		jl.setIcon(new ImageIcon(bimg));
		super.add(jl, BorderLayout.CENTER);
		super.setVisible(true);
	}

	public BufferedImage getImage(int number) throws IOException {
		// unique identifier for temp file
		String uniqueIdentifier = String.valueOf(System.currentTimeMillis());
		// complete filename
		String fileName = "tmp-image-" + uniqueIdentifier;
		// create a temp file
		File tempFile = File.createTempFile(fileName, ".tmp");
		// set deleteOnExit(), if an exception occures
		tempFile.deleteOnExit();
		
		SeekableStream s = new FileSeekableStream(new File("blub.tif"));
		ImageDecoder d = ImageCodec.createImageDecoder("tiff", s, null);
		System.out.println("Anzahl Seiten: " + d.getNumPages());
		RenderedImage op = new NullOpImage(d.decodeAsRenderedImage(number),
				null, OpImage.OP_IO_BOUND, null);
		
		// write image
		ImageIO.write(op, "jpg", tempFile);
		// read image
		BufferedImage buffImg = ImageIO.read(tempFile);
		// delete tempfile
		tempFile.delete();	
		
		return buffImg;
	}


	public static void main(String[] args) throws IOException {
		new Test();

	}
}
das tut bei mir mit deinem tif bild..
problem ist folgendes:
Bei älteren TIFFs welche JPG-Bilder mit nem älteren Codec enthalten spackt JAI ab und kann das Bild nicht auslesen.

Edit:
Auch die TIFFS sind 0-basiert, d.h. getImage(0) liefert Bild 1, getImage(1) liefert Bild 2...

Edit #2:
Für den Teil
Code:
ImageDecoder d = ImageCodec.createImageDecoder("tiff", s, null);
		System.out.println("Anzahl Seiten: " + d.getNumPages());
		RenderedImage op = new NullOpImage(d.decodeAsRenderedImage(number),
				null, OpImage.OP_IO_BOUND, null);
gibts ne bessere Lösung welche nicht deprecated ist. Musst mal schauen, irgendwo auf der Sun-Site oder per Google findest du das entsprechende Codeschnippsel.
 

thE_29

Top Contributor
Code:
    String dateiname = "C:\\uid0500301.tif";
    SeekableStream s = new FileSeekableStream( new File(dateiname) );
    ImageDecoder d = ImageCodec.createImageDecoder("tiff", s, null);
    System.out.println("Anzahl Seiten: "+ d.getNumPages());  
    ImageIO.write(d.decodeAsRenderedImage(0),"jpg",new File("C:\\test_out.jpg"));
    ImageIO.write(d.decodeAsRenderedImage(1),"jpg",new File("C:\\test_out2.jpg"));

Läuft bei mir einwandfrei und erstellt die Bilder!
 

thE_29

Top Contributor
Und hier der Code fürs BufferedImage

Code:
    String dateiname = "C:\\uid0500301.tif";
    SeekableStream s = new FileSeekableStream( new File(dateiname) );
    ImageDecoder d = ImageCodec.createImageDecoder("tiff", s, null);
    System.out.println("Anzahl Seiten: "+ d.getNumPages());
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    ImageIO.write(d.decodeAsRenderedImage(0),"png",stream);
    Image img = Toolkit.getDefaultToolkit().createImage(stream.toByteArray());
    JFrame testFrame = new JFrame();
    testFrame.getContentPane().add(new JLabel(new ImageIcon(img)));
    testFrame.pack();
    testFrame.setLocationRelativeTo(null);
    testFrame.setVisible(true);

Ich habs mal anzeigen lassen, obs auch geht!

Und du nimmst jetzt den Source von Seite 1 wo ich Image in BufferedImage konvertiere und schon hast dein Ergebnis ;)



Nachtrag: Ich hoffe jetzt haben wirs dann endlich :bae: (mit dem Image img den Code dann aufrufen: http://www.java-forum.org/de/viewtopic.php?p=230914#230914 )
 

thE_29

Top Contributor
Nachtrag 2: @KSG warum ein TempFile wenn auch das geht?

Code:
    String dateiname = "C:\\uid0500301.tif";
    SeekableStream s = new FileSeekableStream( new File(dateiname) );
    ImageDecoder d = ImageCodec.createImageDecoder("tiff", s, null);
    System.out.println("Anzahl Seiten: "+ d.getNumPages());
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    ImageIO.write(d.decodeAsRenderedImage(0),"png",stream);
    ByteArrayInputStream in = new ByteArrayInputStream(stream.toByteArray());
    BufferedImage bimg = ImageIO.read(in);



Glaube das ist die "eleganteste" Lösung!

Kein TempFile und kein unnötiges Hin und her konvertieren ;)
 

KSG9|sebastian

Top Contributor
Tempfile war nur ne schnelle (pfusch)Lösung weil die Funktion copyData vom RenderedImage nicht funktioniert. Über nen ByteArray isses besser, das hab ich ja auch schon auf Seite 4 vorgeschlagen :)
 

reibi

Top Contributor
@thE_29:

ES LÄUFT !!! ;-)

Vielen Dank: Dein letztes Beispiel (03. 11. 2006, 10:16) hat gefunzt. Weiss auch nicht was da anders ist als ich das schon ausprobiert hab. Habe ja vorgestern schon mal versucht einn Stream zu hohlen und ihn wieder zu schreiben. Damals liefs nicht; jetzt schon.

naja egal vielen Dank trotzdem

@Alle:
Vielen Dank für die nun bald 6 Seiten Forum. Letztlich hats ja doch noch geklappt.
 

Sharpner

Mitglied
ich haette nachtraeglich noch ne frage,
kann man die Qualitaet des Jpegs auf diese Art beeinflussen?
Is ja aktuell etwa 75% Kompressionsrate.. wie kann man 100% oder so machen?
mfg
Sharpner
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Auflösung (dpi) von TIFF und PNG Bildern auslesen Java Basics - Anfänger-Themen 9
C .tiff Dateien laden, bearbeiten(Werte einfügen),abspeichern Java Basics - Anfänger-Themen 11
M Java und Tiff-Daten Java Basics - Anfänger-Themen 3
M Variablen Werte nach setzen, bei Abfrage wieder alter Wert Java Basics - Anfänger-Themen 11
D Map<String, Integer> sortieren und der reinfolge nach die Glieder abfragen Java Basics - Anfänger-Themen 3
S nach Import von jars (PLC4x) in Eclipse kann nicht mehr compiliert werden Java Basics - Anfänger-Themen 9
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
M Queue-Datenstruktur: nach dem Elementen entfernen, das Ergebnis ist immer noch nicht optimal. Java Basics - Anfänger-Themen 3
N Hey Leute und zwar versuche ich gerade ein 2D Spiel zu Programmieren aber die Figur will sich nicht nach links oder rechts bewegen :( Java Basics - Anfänger-Themen 12
H Liste nach String-Länge sortieren Java Basics - Anfänger-Themen 1
I Bild richtig speichern / Hochkant im File Explorer, nach Upload vertikal Java Basics - Anfänger-Themen 9
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
C Probleme mit Byte konvertieren nach int Java Basics - Anfänger-Themen 10
T sortierung der eingabe nach größe Java Basics - Anfänger-Themen 5
G Bei dynamischer Arrayliste nach jeder Auswahl Zahl entfernen Java Basics - Anfänger-Themen 3
ptcho Werte/Position nach dem Funktionsaufruf tauschen? Java Basics - Anfänger-Themen 1
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
H Cast von Float nach String klappt nicht Java Basics - Anfänger-Themen 12
W LocalDate toString und nach Split falsch "erkannt"? Java Basics - Anfänger-Themen 8
B Array nach Elementwerten sortieren? Java Basics - Anfänger-Themen 1
S Größte Zahl nach Eingabe der Zahl 0 ausgeben Java Basics - Anfänger-Themen 6
I Java Mail Timeout erst nach rund 5 Minuten? Java Basics - Anfänger-Themen 9
FireHorses Einen Command erst nach einer Chateingabe aktivieren Java Basics - Anfänger-Themen 1
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
Jambolo Karten sortieren nach Rang und Farbe Java Basics - Anfänger-Themen 5
Lion.King Subtraktion nach Eingabe im Terminal Java Basics - Anfänger-Themen 7
D Programmieren nach UML Java Basics - Anfänger-Themen 2
rosima26 Java nach letzter Ziffer sortieren Java Basics - Anfänger-Themen 19
H Kompliziertes Sortieren einer ArrayList mit Objekten(Sortieren nach X und Y) Java Basics - Anfänger-Themen 11
H Erste Schritte Nach einer Zahl n soll n Mal der String untereinander ausgegeben werden Java Basics - Anfänger-Themen 3
volcanos List & ArrayList nach Familiennamen abfragen Java Basics - Anfänger-Themen 57
sserio Wie kann man nach einer Klasse fragen? Java Basics - Anfänger-Themen 12
S Java Client-je nach Heap Size Größe startet Applikation oder nicht Java Basics - Anfänger-Themen 4
A String split funktioniert nicht, wenn mehr als 1 Ziffer vor dem Zeichen steht nach dem er trennen soll? Java Basics - Anfänger-Themen 4
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
E Umlaute und Sonderzeichen werden nach der Build Project nicht richtig angezeigt Java Basics - Anfänger-Themen 2
M Bei nach oben scrollen soll Seite aktualisiert werden (Userscript mit Javascript) Java Basics - Anfänger-Themen 10
K log4j nach log4j2 überführen Java Basics - Anfänger-Themen 0
javapingu Jeglichen Inhalt einer Textdatei nach Zeile n löschen Java Basics - Anfänger-Themen 8
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
L Zahlungen nach Monat filtern Java Basics - Anfänger-Themen 2
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
I String nach Wort suchen Java Basics - Anfänger-Themen 6
C ArrayList sortieren nach bestimmten Buchstaben in den Wörtern Java Basics - Anfänger-Themen 13
javaluke Erste Schritte Array nach Datentyp sortieren Java Basics - Anfänger-Themen 16
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
O 2D-Array nach einer Spalte sortieren Java Basics - Anfänger-Themen 22
I Liste gruppieren nach Monat? Java Basics - Anfänger-Themen 5
P Ein Objekt nach einem String durchsuchen? Java Basics - Anfänger-Themen 7
M Nach einer erstmaligen Eingabe, eine zweite Eingabe nur noch gegen bestätigung möglich Java Basics - Anfänger-Themen 2
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
C Meldung einer Klasse nach "oben" Java Basics - Anfänger-Themen 6
B Nach eingefügtem Code erkennt Compiler keine Instanzvar und meldet SyntaxError Java Basics - Anfänger-Themen 2
newcomerJava Nach doppelter Zahl eine Ausgabe Java Basics - Anfänger-Themen 10
M Anzahl Schleifendurchgänge nach x Sekunden anzeigen Java Basics - Anfänger-Themen 2
C Lotto 3, 4, 5, 6 Richtige nach x Ziehungen ermittelt.. Java Basics - Anfänger-Themen 7
G Primzahlen von Rekursiv nach Iterativ Java Basics - Anfänger-Themen 6
F JMenuItem Kann nicht nach einem String benannt werden... Java Basics - Anfänger-Themen 11
R JDK installieren Durcheinander nach installation von SE 14.02 Java Basics - Anfänger-Themen 6
P Sortieren von Listen nach Attributen Java Basics - Anfänger-Themen 3
B DateTimeFormatter nach LocalDateTime, wenn dd.MM.yyyy oder dd.MM.yyyy mm:hh Java Basics - Anfänger-Themen 5
1 main-Methode erweitern, Nachfrage nach wiedeholung Java Basics - Anfänger-Themen 2
G unklares Verhalten nach Instanzierung neuer Klasse Java Basics - Anfänger-Themen 3
S Wohin kommt das „abstract“? Vor oder nach „public“/ „private“ /... Java Basics - Anfänger-Themen 3
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
N Operatoren Schreibtischtest der Reihen-Suche nach Aufschluss in die Basics Java Basics - Anfänger-Themen 1
B Umstieg von C# nach Java Java Basics - Anfänger-Themen 18
Ellachen55 Wie nach häufigste Werte im Array suchen? Java Basics - Anfänger-Themen 2
M Untersuchen ob ein Graph nach entfernen einer Kante immer noch zusammenhängend ist Java Basics - Anfänger-Themen 70
N Wörter und Zahlen nach speziellen Wörtern ausgeben Java Basics - Anfänger-Themen 11
M Werte ändern sich nicht mehr nach Reset Java Basics - Anfänger-Themen 14
B Nach dem kompilieren werden Bilder nicht mehr gefunden Java Basics - Anfänger-Themen 10
X Nach einem Bruch testen ob es eine ganze Zahl ist Java Basics - Anfänger-Themen 6
B String nach erstem Leerzeichen trennen Java Basics - Anfänger-Themen 7
N Speichern von Werten in Variablen nach Schließen des Programms Java Basics - Anfänger-Themen 3
G String wird nach Einlesen aus Datei nicht erkannt Java Basics - Anfänger-Themen 3
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
O zwei Arrays nach Werten durchsuchen und zusammenfügen Java Basics - Anfänger-Themen 3
M Double Wert nach n abschneiden ohne zu runden Java Basics - Anfänger-Themen 1
C Erste Schritte Bilder nach Export anzeigen Java Basics - Anfänger-Themen 0
F Input/Output Files von A nach B kopieren Java Basics - Anfänger-Themen 11
B InputStream (PDF) nach Image (PNG / JPG) konvertieren? Java Basics - Anfänger-Themen 2
O ADT Graph nach größe Abfragen Java Basics - Anfänger-Themen 42
O compareTo nach mehreren Kriterien Java Basics - Anfänger-Themen 13
R Benutzereingaben als Array abspeichern nach Programmstart Java Basics - Anfänger-Themen 5
S Pane nach speziellen Child Objekten durchsuchen Java Basics - Anfänger-Themen 3
V Neue Ausgabe von toString nach Methodenaufruf Java Basics - Anfänger-Themen 9
L Arrayliste von hinten nach vorne ausgeben Java Basics - Anfänger-Themen 10
F Array nach Objektattribut durchsuchen Java Basics - Anfänger-Themen 6
M Rationale Zahl erkennen - Kurze Frage zum Restwert nach Division Java Basics - Anfänger-Themen 3
O String von vorne nach hinten an einem Zeichen Java Basics - Anfänger-Themen 10
Hanschyo Quicksort sortiert von groß nach klein Java Basics - Anfänger-Themen 3
S suche nach varible POSITION ... fuer das pixel-maennchen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben