# GIF Umwandlung in Graustufen



## TomSp (28. Juli 2004)

Hallo erst einmal!

Ich bin neu hier und habe folgende Frage:

ich steh vor einem fast (für mich) unlösbarem Problem. Ich 

muß eine JAVA-Applikation schreiben, die eine als Parameter 

übergebene GIF-Datei in ein Graustufenbild umwandelt. Dabei 

sollen alle Headerinformationen dekodiert und auf dem 

Bildschirm ausgegeben werden. Hat da schon jemand Erfahrung mit und kann
mir dabei helfen? Ich bin auf dem Gebiet absoluter Neuling

Bin für jede Hilfe dankbar

Gruß

Thomas


----------



## squeaker (28. Juli 2004)

Ein guter Anfang wäre die Beschreibung des GIF-Formates

z.B. hier http://www.tnt.uni-hannover.de/js/soft/imgproc/fileformats/ oder weitere links mit google.

Bei GIF könnte die Umwandlung in Graustufen recht einfach sein, in dem einfach die Palette ausgetauscht wird (GIF arbeitet mit einer 256 Farben Palette - wird diese auf Graustufen ausgetauscht, ist das Bild umgewandelt).

zur File Formaten kann ich auch diese Seite hier empfehlen:

www.wotsit.org


----------



## Thomas Darimont (28. Juli 2004)

Hallo!

Da hab ich eine Schlechte Nachricht für dich ... :



> Currently the tags use Java2D (with ImageIO or just AWT) OR Java Advanced Imaging API (JAI). JAI or ImageIO support is loaded if the classes are available. Absence of ImageIO and JAI classes will force the usage of the AWT for loading and encoding/ saving. AWT currently supports only the reading of GIF and JPEG files and encoding of JPEG only.
> 
> Writing GIF is NOT supported by any of the above mentioned libraries. ImageIO may be added separately for Java versions prior to 1.4.



also mit schreiben von GIFs is nix...
wohl aber für jpegs...


```
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class SWDecoder {

	public static void main(String[] args) {
		System.out.println("Processing Image: " + args[0]);
		try {
			File file = new File(args[0]);

			BufferedImage srcImg = ImageIO.read(file);

			System.out.println(srcImg.getType());

			BufferedImage destImg =
				new BufferedImage(
					srcImg.getWidth(),
					srcImg.getHeight(),
					BufferedImage.TYPE_BYTE_GRAY);

			destImg.getGraphics().drawImage(srcImg, 0, 0, null);

			StringBuffer sb = new StringBuffer();
			sb.append(file.getParent());
			sb.append("\\");
			sb.append(file.getName());
			sb.insert(sb.lastIndexOf("."), "_sw");

			ImageIO.write(destImg, "jpeg", new File(sb.toString()));

		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
```

einfach aufrufen mit

java SWDecoder c:\MeinImage.jpg

Gruß Tom


----------



## squeaker (28. Juli 2004)

Das schöne ist - er braucht ja gar nicht das ganze Bild encoden/decoden. Header (für die Ausgabe) und Palette (für die Umwandlung) reicht schon.


----------



## TomSp (28. Juli 2004)

Vielen Dank für Eure Antworten!

Das werde ich mal ausprobieren.

Gruß
Thomas


----------



## TomSp (29. Juli 2004)

Hallo squeaker,

kannst Du mir auch sagen wie das mit dem Decoden/Encoden funktioniert?
Oder macht das schon der Quelltext von Tom, wenn ja wo?

Gruß

Thomas


----------



## squeaker (29. Juli 2004)

Der Quelltext von Tom funktioniert glaube ich nur mit JPEGS.

Du musst die Datei binär einlesen und zuerst den Header verarbeiten (gemäß Spezifikation). Aus dem Header ziehst du dann die Informationen über Palette und Bild. Aber genauer mit gif habe ich mich noch nicht beschäftigt. Ich muss dich bis Mo vertrösten - bis dahin hab ich nicht genug Zeit.
Probier einfach mal dich an der Spezifikation entlang zu hangeln.

siehe dazu auch: http://www.wotsit.org


----------



## Thomas Darimont (29. Juli 2004)

Hallo!



> Der Quelltext von Tom funktioniert glaube ich nur mit JPEGS.



Deshalb schrieb ich auch:



> wohl aber für jpegs...


 ;-)

Gruß Tom


----------



## TomSp (29. Juli 2004)

Hallo squeaker,

danke, werde versuchen mich durchzuarbeiten.


Hallo Tom,

funktioniert es denn ein gif einzulesen, dann über den Header in Graustufen umzuwandeln und als jpg abzuspeichern? 

Gruß
Thomas


----------



## squeaker (29. Juli 2004)

prinzipiell ja - aber dazu musst du das ganze Bild dekomprimieren mit einem (De)kompressionsalgorithmus den JAVA nicht unterstützt (da erst diesen Sommer die Patente darauf auslaufen).
Ich vermute, dass du einfach nur die Palette austauschen kannst - was die die rumkomprimiererei sparen würde.

ausserdem ist JPEG schlecht für GIF-Bilder (die haben einen anderen Farbaufbau und sind mit GIF meist besser komprimierbar - verlustlos sogar - als mit jpeg).


----------



## TomSp (29. Juli 2004)

Hallo nochmal an euch beide,

ich habe den Quellcode von Tom mal mit einer GIF-Datei getestet und stellt euch vor das funktioniert auch und wird sogar wieder als GIF gespeichert. 

Könnt Ihr mir auch sagen  wie ich es machen kann die Headerinfos auszulesen und auf dem Bildschirm auszugeben? Wie ich sehe seid Ihr voll die Profis.


Auf jeden Fall schon mal vielen Dank an Euch

Gruß Thomas


----------



## Thomas Darimont (29. Juli 2004)

Hallo!



> ich habe den Quellcode von Tom mal mit einer GIF-Datei getestet und stellt euch vor das funktioniert auch und wird sogar wieder als GIF gespeichert.



Ähm, das ist so nicht ganz korrekt ;-)


```
StringBuffer sb = new StringBuffer();
			sb.append(file.getParent());
			sb.append("\\");
			sb.append(file.getName());
			sb.insert(sb.lastIndexOf("."), "_sw");
```

Wie du hier siehst baue ich hier den Dateipfad zur Zieldatei auf in dem ich einfach den alten Dateipfad nehme und den namen vor dem "." um ein "_sw" ergänze.
Die Dateierweiterung übernehme ich, und wenn du das ganze mit der Endung gif. aufrufst erhälst du auch eine Zieldatei mit der Endung gif jedoch ist diese Zeildatei nicht im gif Format koodiert sondenr im JPEG ;-)

Das ist ziemlicher murks und ich weis nicht ob nicht irgendwelche Programme damit Probleme haben ...

Gruß Tom


----------



## TomSp (29. Juli 2004)

Hallo Tom,

na da siehst Du mal, dass ich wirklich noch nicht viel Ahnung habe. War nur überrascht das Windows die Datei weiter als Dateityp GIF anzeigt.


Gruß
Thomas


----------



## Thomas Darimont (29. Juli 2004)

Hallo!

Welche Informationen benötigst du denn aus dem Image Header?

Gruß Tom


----------



## TomSp (29. Juli 2004)

Hallo,

ich benötige alle Infos welche für das Decodieren und Umwandeln gebraucht werden.

Gruß
Thomas


----------



## squeaker (29. Juli 2004)

noch einmal der Link: erklärung gif und kompression

und hier das Dateiformat: GIF 

um das lesen wirst du nicht drum herum kommen. Wenn du fragen zu den Dokumenten hast, stell sie. Dann lese ich mir das ganze bis dahin durch und versuche sie dir zu beantworten.


----------



## TomSp (29. Juli 2004)

Hallo squeaker,

die Dokus sind ganz einleuchtend.

Danke für Deine Hilfe!

Gruß
Thomas


----------



## squeaker (29. Juli 2004)

Falls du Fragen zu LZW haben solltest, die hatte ich in meiner Facharbeit - das wieder einarbeiten sollte also kein Problem sein. Viel Erfolg.


----------

