# 3 Bildtypen abkürzen



## Network (11. Jan 2011)

Hi,

Ich lese ein .tga Bild in mein Java-Programm ein. Es handelt sich dabei um eine Tilepalette, die unter anderem Bilder für JButtons enthält.

Das Problem ist, dass ich von dieser Tilepalette natürlich nur einzelne Bilder brauche, das TGA-Bild wird aber als "Image" zurückgegeben!
Mir ist aber nur die Methode subImage() von BufferedImage bekannt.
Der JButton kann soweit ich weiss ja nur ImageIcons verwenden.

Mit anderen Worten, das ganze sieht so aus:

```
Label observer = new Label();

Image image = Jimi.getImage( file );
int width = image.getWidth(observer);
int height = image.getHeight(observer);

BufferedImage bfImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

bfImage.getGraphics().drawImage(image, 0, 0, observer);

ImageIcon img = new ImageIcon( bfImage.getSubimage(x, y, w, h) );
		
return img;
```

Häufig zu 75% sag ich einfach mal kommt nur ein schwarzes Bild zurück. Das ganze ist sehr Fehler anfällig und nicht gerade schön!

Kennt da jmd. eine bessere Methode?


Vielen vielen Dank schonmal
PS: Die Bilder auf der Festplatte MÜSSEN im tga-Format bleiben! Ein Duplikat auf der Festplatte mit anderer Endung möchte ich nicht haben (zuviel)!


----------



## tagedieb (12. Jan 2011)

java.awt.Image hat gesagt.:
			
		

> /**
> * Determines the height of the image. If the height is not yet known,
> * this method returns <code>-1</code> and the specified
> */
> public abstract int getHeight(ImageObserver observer);



Was kriegst du bei getWidth(..) und getHeight(..)? Kann es sein dass er manchmal -1 zurueckgibt.

Ein BufferedImage laesst sich auch einfacher erstellen:


```
BufferedImage bi = ImageIO.read(file);
```


----------



## Quaxli (12. Jan 2011)

Ich wüßte nicht, daß die Methode getSubImage fehleranfällig wäre. Ich nutze diese standardmäßig in einer SpriteLib. So aus dem Bauch raus, würde ich sagen, daß es an Deinem Programm liegt.

Zum Einen würde ich mal prüfen, ob Du auch immer ein tatsächliches Bild hast. Wie tagedieb schon dargestellt hat, geht das auch einfacher. Zum Anderen wäre ein kompilierbares Beispiel schön, an dem man Dein Problem nachvollziehen kann.


----------



## tagedieb (12. Jan 2011)

Wieso liest du eigentlich das File jedesmal neu ein. Wuerde es nicht Sinn machen das Image im Cache zu halten?


----------



## Network (12. Jan 2011)

tagedieb hat gesagt.:


> Was kriegst du bei getWidth(..) und getHeight(..)? Kann es sein dass er manchmal -1 zurueckgibt.
> 
> Ein BufferedImage laesst sich auch einfacher erstellen:
> 
> ...



...Also er gibt immer 256x256 zurück, was der Tilepalette entspricht. Beim ersten mal kommt immer ein schwarzes Bild, nach mehrmaligem Laden kommt das Bild dann irgendwann...

...Mag sein, aber ImageIO unterstützt keine Bilder mit Targacodierung (Bild.tga), dafür muss ich Jimi benutzen, aber Jimi gibt nur ein "Image" zurück. Es gibt auf folgender Seite ein "Plugin" (netsys-it) für TGA Dateien, dass man dann anscheinend "nur" unter lib/ext ablegen soll. Da sind aber leider mehrere Ordner... und ich hab keine Ahnung was ich mit dem ganzen machen soll... einfach alle Ordner reinkopieren bringt nichts.



Quaxli hat gesagt.:


> Ich wüßte nicht, daß die Methode getSubImage fehleranfällig wäre. Ich nutze diese standardmäßig in einer SpriteLib. So aus dem Bauch raus, würde ich sagen, daß es an Deinem Programm liegt.
> 
> Zum Einen würde ich mal prüfen, ob Du auch immer ein tatsächliches Bild hast. Wie tagedieb schon dargestellt hat, geht das auch einfacher. Zum Anderen wäre ein kompilierbares Beispiel schön, an dem man Dein Problem nachvollziehen kann.



Ich meine nicht, dass subimage fehleranfällig ist, sondern so eine verworrene Programmstruktur.

Also das Verzeichnis exitiert wirklich und die Bilddateien auch, denn wie bereits gesagt, nach mehrmaligem laden funktioniert es... warum auch immer.

Kompilierbares Beispiel kann ich geben, ist nur die Frage ob jmd. überhaupt Lust hat dann noch die Jimi-Files zu downloaden, plus .tga Bild 
Was ich gepostet hab ist aber eig. auch schon alles... man muss es nur in eine Klasse legen und img auf ein JButton zeichnen lassen.



tagedieb hat gesagt.:


> Wieso liest du eigentlich das File jedesmal neu ein. Wuerde es nicht Sinn machen das Image im Cache zu halten?



Wo lese ich das Bild "jedesmal" erneut ein?


Ich danke schonmal... das kommt alles ein schönes großes Stück näher


----------



## Gastredner (13. Jan 2011)

Network hat gesagt.:


> ...Mag sein, aber ImageIO unterstützt keine Bilder mit Targacodierung (Bild.tga), dafür muss ich Jimi benutzen, aber Jimi gibt nur ein "Image" zurück. Es gibt auf folgender Seite ein "Plugin" (netsys-it) für TGA Dateien, dass man dann anscheinend "nur" unter lib/ext ablegen soll. Da sind aber leider mehrere Ordner... und ich hab keine Ahnung was ich mit dem ganzen machen soll... einfach alle Ordner reinkopieren bringt nichts.


Vergiss das mit lib/ext, Bibliotheken sollten direkt mit ins Projekt.
Arbeitest du mit Eclipse? Wenn ja: Lege im Projekt einen Ordner "lib" an (Name ist egal, lib ist aber weit verbreitet), kopiere die Bibliothek (sollte ein .jar sein) dort hinein und füge sie über Rechtsklick->Build Path->Add to Build Path dem Build Path hinzu.


----------



## Evil-Devil (13. Jan 2011)

Meinst du nicht das eine ganze Lib nur für das Laden von TGAs ein wenig übertrieben ist? TGAs kann man schnell selbst laden, das ist nicht viel Code, ok das Rad wird neu erfunden, aber gleich eine ganze Lib von der man vieles vermutlich nicht einmal benötigt?


----------



## Gastredner (13. Jan 2011)

Die Bibliothek besteht nur aus drei Klassen, da steckt also kein Monster mit unzähligen Funktionen hinter.


----------



## Network (14. Jan 2011)

Danke @Gastredner für die kurze Einleitung. Funktioniert prima, und noch besser: Endlich mal ein TGA-Reader der mir ein BufferedImage zurückgibt, und sogar die Transparenz nicht durch die Farbe schwarz ersetzt!!! =D

Alles was man im Internet findet ist echt schrott, die Hälfte funktioniert nicht oder benötigt weitere Libs, die andere Hälfte hat soviele Funktionen, die man eig. garnicht braucht oder zu wenig Funktionen, wie bspw. die Transparenz.

bin Glücklich... 
vielen vielen Dank

Gruß


----------



## tagedieb (15. Jan 2011)

Wieso benutzt du .tga Files? Was ist der Vorteil gegenueber .gif oder .png?
Gibt es einen besonderen Grund fuer die Verwendung von .tga? 

Ich kenn mich mit den Vor- und Nachteilen der einzelnen Grafikformate nicht aus, deshalb wuerd mich hier interessieren was fuer die Verwendung von .tga spricht.


----------



## Network (15. Jan 2011)

tagedieb hat gesagt.:


> Wieso benutzt du .tga Files? Was ist der Vorteil gegenueber .gif oder .png?
> Gibt es einen besonderen Grund fuer die Verwendung von .tga?
> 
> Ich kenn mich mit den Vor- und Nachteilen der einzelnen Grafikformate nicht aus, deshalb wuerd mich hier interessieren was fuer die Verwendung von .tga spricht.



Tga-Bilder benutze ich eig. nur weil die Bilder bereits von einem anderen Programm verwendet werden bzw. für dieses Programm entwickelt wurde. Alle Bilder in PNG konvertiert mitzuschicken... das würde den Speicherplatz in die Höhe treiben.

Trotzdem haben TGA-Dateien einen Vorteil. Sie sind eig. normale Bilddateien aber ohne Verlust. Sie werden oft als Screenshots oder dergleichen erstellt von Programmen. Denn sie sind, wie bereits erwähnt ohne Verlust. Und sind je nach Speicherung auch noch beim Zoomen scharf.

Hinzu kann man in diesen Bildern noch weitere Informationen hinterlassen, Transparenz Unterstützung, Alpha-Kanal.... etc.

Ein Vorteil gegenüber png eig. nur in der leicht besseren Schärfe, aber png ist durch die weitere Verbreitung und der daraus folgenden Unterstützung ein wenig besser. Jedoch sollte man sich dabei auch im klaren sein, dass solche Bilder dann von jedem der ein Ordner öffnen kann, diese png-Bilder durch Programme wie "Paint" einfach mal so ohne Mühe verändern kann.

Gegenüber Gif gibt es eig. auch keine Vor oder Nachteile, wie bei png eig. das selbe. Mein Programm erstellt aus den Targa-Dateien bspw. ein paar animierte Bilder, die ich auch gleich in Gif hätte speichern können. Einem Test zu urteilen gehts der Systemleistung aber so besser, was ich mir aber auch nicht wirklich erklären kann.


----------

