Swing Zweidimensionales Array mit Farben erzeugen

Mr. J

Mitglied
Hallo,
ich habe ein Problem. Und zwar habe ich ein Farbarray (Color[][] farbarray). Dieses Array fülle ich in zwei verschachtelten Schleifen (mit Zähler i und j) mit Farbwerten in der Art farbarray[j] = new Color(variable1,variable2,variable3). Variable 1,2 und 3 verändern sich während der Schleifendurchläufe auch.
Mein Problem ist jetzt dass mein Programm sehr viel Speicher frisst und mich würde interessieren ob ich irgendwo was falsch mache und unnötig Speicher verschwende.

MfG
Mr. J
 

Marco13

Top Contributor
Jein. Vielleicht. Vielleicht auch nicht. Vermutlich aber schon. Die gesamte Information, die in einem (ca. 30 byte großen???) Color-Objekt steckt, passt auch in einen (4 byte großen) 'int'.

Wie groß ist denn der Array, und wie viel Speicher wird verbraucht?
 

Mr. J

Mitglied
Im aktuellen Test ist das Array 3000*3000 groß und der Speicherverbrauch liegt zwischen 700Mb und 1000Mb. Ich kann mal ein Codestück posten:

Java:
Color[][] pixelcolors = new Color[dimx][dimy];
for ( int outercounter = 1; outercounter <= dimy; outercounter++ ) {
posdir = (float) outercounter / (float) dimy;
posvar = ((float) start / (float) 255) + (((float) (stop-start) * (float) outercounter) / ((float) 255 * (float) dimy));  
int counthlp = outercounter;
for ( int innercounter = 1; innercounter <= dimx; innercounter++) {
posfix = (float) innercounter / (float) dimx;
pixelcolors[innercounter-1][dimy-counthlp] = new Color(posdir,posfix,posvar);
}
}

Die Variablen dimx und dimy werden von außen geliefert. Mit pixelcolors wird anschließend ein neues Objekt erzeugt in dem pixelcolors, dimx, dimy und ein String gespeichert werden.

MfG
Mr. J
 
M

Marcinek

Gast
Eventuell mal den Sinn dieses Programms beschreiben.

Müssen diese Farben gespeichert werden?

Immerhin sind es fast 9 Millionen Farben ... Wieviele verschiedene gibt es da? Hat jedes Feld eine andere Farbe?
 

Mr. J

Mitglied
Eigentlich sind es genau 9 Millionen Farben :D

Aber ja, es ist notwendig sie zu speichern. Das Programm erzeugt mir eine Farbkarte die ich zum Einen später speichern und wieder laden können will und zum anderen in einem Fenster anzeigen lasse.

MfG
Mr. J
 

Marco13

Top Contributor
Uuuunnnd... wenn du jetzt mal genau den Unterschied erklären würdest, zwischen "Farbkarte" und "stinknormales Bild" würde das sicher helfen. Im Moment würde nichts dagegen sprechen, sich von jeder Color das getRGB zu holen, und das als Pixel in ein BufferedImage zu setzen...das wären dann ca. 36 MB...
 

Mr. J

Mitglied
Das Problem ist dass ich im Moment zwar nur mit dem RGB-Farbraum arbeite, allerdings soll dies später auf weitere Farbräume und Farbmodelle erweitert werden. Von daher brauche ich eine Datenstruktur die pro Pixel einen Farbwert speichert, der Farbwert kann z.B. aus RGB-, CMYK-, HSV- oder Lab-Farbraum sein.

MfG
Mr. J
 

Marco13

Top Contributor
Hmja. Aber ein "Color"-Objekt spreichert auch nicht die Information in ALLEN Farbräumen (und wenn doch, würde das den absurd hohen speicherverbrauch erklären). D.h. auch da muss man ggf. umrechnen. Wenn man alles als BufferedImage oder int[][] speichert, kann man die einzelnen RGB-Werte dann ja genauso umrechnen - NOTFALLS in dem man aus dem rgb-Int ein neues Color-Objekt erstellt, aber da gibt's dann ggf. auch effizientere Möglichkeiten..
 
M

Marcinek

Gast
Ich würde diese 9 Millionen Farben garnicht im Hauptspeicher ablegen..

Sie sind dynaamisch erzeugt und daher kann ich zu jederzeit via Rechnung sagen, welche Farbe an X, Y ist.

Wenn ich die exakte Konfigration nochmal benötige, dann würde ich eine Datei schreiben mit den Farben.

Gruß,

Martin
 

Mr. J

Mitglied
Ich sollte also die einzelnen Komponenten der jeweiligen Arrayeinträge gleich als fertiges Ergebnis speichern statt 3 Einzelwerte und am besten gleich auch in einer Datei ablegen statt sie im Speicher zu behalten?

MfG
Mr. J
 

Marco13

Top Contributor
Hm. Das mit der Datei erschließt sich mir jetzt auch nicht ganz ???:L Also, es geht erstmal um ca. 40 MB, das sollte ja kein Problem sein. Und in diesem Fall ist "in einem Array nachsehen" IMMER schneller, als irgendeine Berechnung....
 

Mr. J

Mitglied
Hm, ja, aber bei mir wird das Programm ja viel viel viel größer und ich weis noch nicht ganz warum, aber wahrscheinlich wärs sinnvoller die 3 Werte einfach als Array aus 3 Ints zu speichern statt als Color? Oder um mal anders zu fragen: wie kann ich es möglichst effizient ablegen so dass mein Programm nicht um so viel größer wird?

Statt den Farben nur die Erzeugungsparameter abzulegen ist keine Alternative da das Bild später auch zugeschnitten oder evtl. verzerrt werden soll und da will ich dann schon auf den Werten direkt arbeiten und wenn ichs speicher dann muss ichs sowieso als Datei ablegen.

MfG
Mr. J
 

Marco13

Top Contributor
Jetzt redest du ja schon von einem Bild ;) Da ist der Schritt zum anfangs schon erwähnten BufferedImage ja nicht weit. Das speichert R,G,B,A in EINEM int. Ist doch praktisch :)
 

Murray

Top Contributor
Statt den Farben nur die Erzeugungsparameter abzulegen ist keine Alternative da das Bild später auch zugeschnitten oder evtl. verzerrt werden soll und da will ich dann schon auf den Werten direkt arbeiten und wenn ichs speicher dann muss ichs sowieso als Datei ablegen.
Das verstehe ich nicht so richtig. Bezieht sich das auf Marcineks Post?

Marcinek hat zu Recht geschrieben, dass sich die Werte des Arrays in Anhängigkeit der beiden Laufvariablen errechnen.
Etwas formaler: colors[x,y] = f(x,y);
Insofern könnte man dort, wo man später auf das Array zugreift, auch direkt die zugrundeliegende Methode aufrufen.
Also geht statt
Code:
for ( x = ...) {
  for ( y = ...) {
    colors[x, y] = f(x,y);
  }
}
...
Color whatever = colors[ someX, someY];
auch
Code:
Color whatever = f( someX, someY);

Das Array kann sich lohnen, wenn
- die gleichen Koordinaten mehrfach abgefragt werden
- die Berechnung an sich aufwändig ist
- nicht nur einige wenige Koordinaten abgefragt werden

Ist das in Deinem Fall so?
 

Mr. J

Mitglied
Jetzt redest du ja schon von einem Bild ;) Da ist der Schritt zum anfangs schon erwähnten BufferedImage ja nicht weit. Das speichert R,G,B,A in EINEM int. Ist doch praktisch :)

Ja, nur gehe ich bei einem BufferedImage davon aus dass ich ein RGB-Farbmodell vorliegen habe, da es aber auch andere Farbmodelle sein können kann ich das BufferedImage nicht nehmen. Ich wandle meine Datenstruktur zur Anzeige in ein BufferedImage um und lasse es dann anzeigen aber als generelle Struktur kann ichs leider nicht nehmen.

-------------------------------------------------

Das Array kann sich lohnen, wenn
- die gleichen Koordinaten mehrfach abgefragt werden
- die Berechnung an sich aufwändig ist
- nicht nur einige wenige Koordinaten abgefragt werden

Ist das in Deinem Fall so?

Ja, vor allem sollen die Daten später auch verändert werden, z.B. verzerrt, von daher würde ich nicht die Erzeugungsfunktion speichern sondern lieber die Daten direkt.

MfG
Mr. J
 
Zuletzt bearbeitet:

Mr. J

Mitglied
Was mir auch grad noch aufgefallen ist wenn ich mit kleineren Testwerten arbeite: das Programm verbraucht jedes mal mehr Speicher wenn ich einen neuen Schleifendurchlauf aufrufe. Ist das normal oder habe ich das irgendwo ein Speicherleck, evtl. weil ich für jeden Eintrag eine new Color erzeuge und der Garbagecollector sie nicht richtig entsorgt?

MfG
Mr. J
 

Marco13

Top Contributor
OK, habe jetzt mal in die Color.java geschaut:
Java:
    transient private long pData;
    int value;
    private float frgbvalue[] = null;
    private float fvalue[] = null;
    private float falpha = 0.0f;
    private ColorSpace cs = null;
D.h. ein Color-Objekt belegt ggf. so um die 80-100 bytes :shock: Wen du meinst, dass der RGB-int nicht reicht, dann vermute ich mal, dass meine ... Kenntnisse in bezug auf Farbmodelle und deren Repäsentation nicht ausrechen, um das nachvollziehen zu können (habe ich gerade auch in einem anderen Thread gemerkt). Aber zumindest wäre es IMHO nahe liegend, sich eine Form für diese Daten zu überlegen, die in dem Sinne "allgemeingültig" ist, dass sie so mächtig ist, dass sie "alle" Farben speichern kann, die bei diesem Vorhaben auftreten - Ganz naiv gesagt: Ein Array mit 4 floats sollte doch für alle praktischen Zwecke reichen?

EDIT: Zum Thema Speicherleck kann man GROB sagen: Ein Speicherleck hat man, wenn ein OutOfMemoryError kommt, obwohl keiner kommen sollte. Was Windows oder so im TaskManager als Speicherverbrauch anzeigt, sagt nicht viel aus. Wenn Speicher benötigt wird, schaufelt der GC den schon frei, sofern er das kann, aber wenn der Speicher NICHT gebraucht wird, und das Freischaufeln so gesehen nicht "notwendig" ist, macht er das auch nicht unbedingt.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Zweidimensionales Array - JToggleButton AWT, Swing, JavaFX & SWT 3
B zweidimensionales Buttonarray auf Panel AWT, Swing, JavaFX & SWT 11
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
L Swing Wert vom Textfield in Array List hinzufügen AWT, Swing, JavaFX & SWT 2
A 2d array AWT, Swing, JavaFX & SWT 1
J Fenster mit Inhalten aus einem Array Füllen AWT, Swing, JavaFX & SWT 4
M Swing Objekt Array in GUI ausgeben AWT, Swing, JavaFX & SWT 1
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
G Eingabe in JTextField in Array speichern und in JList ausgeben AWT, Swing, JavaFX & SWT 7
J index im Array aussuchen AWT, Swing, JavaFX & SWT 1
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
G JavaFX Fenster 1 Array übertragen zur Fenster 2 AWT, Swing, JavaFX & SWT 0
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
F JList auffüllen aus Array von Instanzen AWT, Swing, JavaFX & SWT 4
kilopack15 JLabels im Array erzeugen AWT, Swing, JavaFX & SWT 2
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
M JavaFX - Array in View auslesen AWT, Swing, JavaFX & SWT 12
S AWT Daten über TextField und Button in array speichern AWT, Swing, JavaFX & SWT 5
E AWT Bilder als "Array" abspeichern. AWT, Swing, JavaFX & SWT 4
J JavaFX Buttons mit Array erzeugen AWT, Swing, JavaFX & SWT 1
beatles Swing JTextField - Game Status aus Array anzeigen AWT, Swing, JavaFX & SWT 3
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
Viktim Array Spielfeld wird in GUI gedreht AWT, Swing, JavaFX & SWT 5
T JTextField Array im JPanel wird nicht komplett angezeigt AWT, Swing, JavaFX & SWT 7
S AWT JTextFields durch Array im JMenu erzeugen? AWT, Swing, JavaFX & SWT 19
L JComponents in Array AWT, Swing, JavaFX & SWT 11
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
B Array Java AWT, Swing, JavaFX & SWT 0
S JTable Daten aus Array AWT, Swing, JavaFX & SWT 9
K Array von einer Action zur anderen bringen AWT, Swing, JavaFX & SWT 7
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
O 2D Weltgenerieren - 2D Array AWT, Swing, JavaFX & SWT 1
W Bei Button-klick neuen button in array hinzufügen AWT, Swing, JavaFX & SWT 7
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
F Swing Java Swing Array in Datei und wieder raus AWT, Swing, JavaFX & SWT 7
L 2D-Grafik PNG Datei in JLabel Array Problem AWT, Swing, JavaFX & SWT 4
R Array aus einem Objekt auslesen AWT, Swing, JavaFX & SWT 4
S ComboBox-Werte aus einem Array an Textfields übergeben AWT, Swing, JavaFX & SWT 3
A Array von JLabel mit Grafiken anzeigen AWT, Swing, JavaFX & SWT 3
J 2D-Grafik String aus array wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
S Swing Jcombobox und array AWT, Swing, JavaFX & SWT 6
M Swing Array aus anderer Klasse AWT, Swing, JavaFX & SWT 6
M Array grafisch darstellen AWT, Swing, JavaFX & SWT 9
P 2D-Grafik versch. Rectangles aus array von textfelder zeichen AWT, Swing, JavaFX & SWT 6
V Swing Componenten Array AWT, Swing, JavaFX & SWT 3
P Grauwerte aus 3-Dimensionalem Array in Bild AWT, Swing, JavaFX & SWT 9
F Bilder werden nicht in's Array geladen AWT, Swing, JavaFX & SWT 4
B Swing JMenuButtons mit Funktionen aus Array erstellen AWT, Swing, JavaFX & SWT 4
A JComboBox-Inhalt durch neues Array ersetzen AWT, Swing, JavaFX & SWT 2
A JButton in einem Array aktualisieren AWT, Swing, JavaFX & SWT 8
K Applet Wieso kann ich keine Array im Applet initialisieren AWT, Swing, JavaFX & SWT 13
S String Array Ausgabe im JLabel ??? AWT, Swing, JavaFX & SWT 8
L Fehler beim erstellen einer Tabelle mithilfe von 2d-Array AWT, Swing, JavaFX & SWT 3
H 2D-Grafik BufferedImage aus Integer-Array AWT, Swing, JavaFX & SWT 3
H Puzzle - Listen erstellen, array & liste vergleichen AWT, Swing, JavaFX & SWT 28
H Puzzle - Erkennen wenn gelöst (array vergleichen) AWT, Swing, JavaFX & SWT 10
H Bilder in Array zufällig anordnen AWT, Swing, JavaFX & SWT 4
W Swing Bei einem 2-dimensionalen array, bei mouseClicked index zuordnen AWT, Swing, JavaFX & SWT 2
Jats Bitte um Hilfe bei JComboBox mit Array AWT, Swing, JavaFX & SWT 6
N Swing Von 2 dimensionalem Array auf JTextfield schließen und färben AWT, Swing, JavaFX & SWT 6
H JList zeigt die Daten aus dem Array nicht an! AWT, Swing, JavaFX & SWT 13
W Button Array ? AWT, Swing, JavaFX & SWT 10
X JLabel und mehrdimensionales Array AWT, Swing, JavaFX & SWT 2
T Swing 2d Array zeichnen AWT, Swing, JavaFX & SWT 4
M ArrayList in 2D Array umfüllen AWT, Swing, JavaFX & SWT 9
F Swing String Array mit JTextArea anzeigen AWT, Swing, JavaFX & SWT 13
E ResultSet als Array an JTable übergeben AWT, Swing, JavaFX & SWT 9
D Bild zeichnen lassen aus array, null pointer Exception AWT, Swing, JavaFX & SWT 2
D Pixel in ein Array einlesen AWT, Swing, JavaFX & SWT 2
S Koordinaten aus Array verwenden zum zeichnen auf JPanel?! AWT, Swing, JavaFX & SWT 3
Developer_X Verzwicktes Problemchen mit Panel-Array AWT, Swing, JavaFX & SWT 5
JavaKaffee Array auslesen in jTextPane? AWT, Swing, JavaFX & SWT 9
N Swing Problem beim Einlesen von Jtable in Array AWT, Swing, JavaFX & SWT 5
S Swing ComboBox aus Array befüllen AWT, Swing, JavaFX & SWT 2
T Swing JTable und mehrdimensionales Array AWT, Swing, JavaFX & SWT 2
D Verschiedene ActionEvents für ein JButton-Array AWT, Swing, JavaFX & SWT 2
B Keine Änderungen an JLabel durch Array möglich AWT, Swing, JavaFX & SWT 12
W Objekt-array als Raster visualisieren AWT, Swing, JavaFX & SWT 3
C JPanel-Array in GridLayout AWT, Swing, JavaFX & SWT 4
S Array+INfoBox AWT, Swing, JavaFX & SWT 7
A Array wird im JOptionPane mehrfach ausgegeben AWT, Swing, JavaFX & SWT 3
B JButton+Array AWT, Swing, JavaFX & SWT 2
R zweidim. JButton-Array in Schleife -> NullPointerExceptio AWT, Swing, JavaFX & SWT 2
D Fehler bei Button Array AWT, Swing, JavaFX & SWT 8
S Suchen im String-Array AWT, Swing, JavaFX & SWT 3
M Separator in Array AWT, Swing, JavaFX & SWT 8
C Out of Bounds Exception, Array of JTextField AWT, Swing, JavaFX & SWT 6
C JButton Array - ActionListener AWT, Swing, JavaFX & SWT 10
S SimpleAttributeSet / Array AWT, Swing, JavaFX & SWT 3
B JButton array und ActionListener AWT, Swing, JavaFX & SWT 2
G JTextArea Objekte in einem Array speichern? AWT, Swing, JavaFX & SWT 3
S Großes Array Problem AWT, Swing, JavaFX & SWT 10
G Listener (anonyme Klasse) jedem Element eines Array zuweisen AWT, Swing, JavaFX & SWT 5
S array to int? AWT, Swing, JavaFX & SWT 9
T Textfelder als Klasse im Array? AWT, Swing, JavaFX & SWT 3
N Image Array einer anderen Klasse bearbeiten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben