GIF Umwandlung in Graustufen

TomSp

Grünschnabel
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
 
Zuletzt bearbeitet:
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
 
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...

Code:
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
 
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.
 
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
 
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
 
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
 
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).
 
Zurück