# Farbig zeichnen ohne java.awt.Color?



## Grizzly (20. Mrz 2005)

Hi,

hab' folgendes Problem:
Ich möchte eine Grafik zeichnen, die relativ viele verschiedene Farben enthält. Um aber in einer bestimmten Farbe zeichnen zu könne, muss man aber ja ein Objekt der Klasse Color instanzieren (wenn man mehr bzw. andere Farben braucht, als die Standard Konstanten der Klasse Color). Wenn man das Zeichnen aber in sehr kurzen Abständen hintereinander macht, müllt man zwangsweise den Speicher mit Color Objekten zu. Bei 16,7 Mio. Farben (soll jetzt nur ein Beispiel sein) sind das immerhin 16,7 Mio. Objekte. Wenn man diese alle am Anfang einmal anlegt und dann mehrfach verwendet, ist der komplette (oder auf jeden Fall jede Menge davon) Hauptspeicher nur für die Farben weg. Macht man dies jedoch nicht, frisst der Garbage Collector einem die ganze Performance.

Gibt es eine Möglichkeit, ohne ein Color Objekt farbig in ein Bild zu zeichnen?


----------



## Illuvatar (20. Mrz 2005)

Nun ja, du könntest alle Pixel von einem BufferedImage setzen, dann wird das Java für dich machen.

Oder du speicherst alle bisher benötigten Objekte in einer Hashtable.


----------



## Grizzly (20. Mrz 2005)

Illuvatar hat gesagt.:
			
		

> Nun ja, du könntest alle Pixel von einem BufferedImage setzen, dann wird das Java für dich machen.
> 
> Oder du speicherst alle bisher benötigten Objekte in einer Hashtable.


Die zweite Möglichkeit hab' ich ja schon in meinem Post geschrieben. Da wäre aber - wie schon geschrieben - der Speicherverbrauch zu hoch.

Wie meinst Du das mit dem BufferedImage? Das ich ein BufferedImage von 1 x 16,7 Mio. Pixel mache, dort alle Farben unterbringe und dann mit einem java.awt.image.PixelGrabber Objekt wieder auslese? :bahnhof: 



_EDIT:_ Sehe gerade, das PixelGrabber die Farben als RGB-Werte zurückgibt. Müsste also wieder Color-Objekte erzeugen. Bringt also auch nix.


----------



## Beni (20. Mrz 2005)

BufferedImage hat eine Methode "setRGB( x, y, rgb )". Mit dieser Methode könntest du einzelne Pixel ändern, ohne ein Color-Objekt zu benötigen.


----------



## Grizzly (20. Mrz 2005)

Beni hat gesagt.:
			
		

> BufferedImage hat eine Methode "setRGB( x, y, rgb )". Mit dieser Methode könntest du einzelne Pixel ändern, ohne ein Color-Objekt zu benötigen.


Hey, die Methode hab' ich bisher irgendwie übersehen. 

Da gibt es nur zwei kleine Problem:
1. Nur die Klasse BufferedImage besitzt die Methode, VolatileImage bspw. nicht.
2. Ich müsste dann komplett alle Zeichenoperation selber noch einmal implementieren.


----------



## Grizzly (21. Mrz 2005)

Hab' jetzt das restliche WE über noch ein bisschen gegrübelt. Anscheinend ist eine Palette der einzige gangbare weg. 
Falls jemand noch etwas besser einfällt: Melden!


----------

