PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fileimage erzeugen



Jana
25-10-2006, 14:10
Ich versuche aus einem File ein Image zu erzeugen.
Es klappt auch ganz gut.
Mein Problem ist, daß bei einer größeren Breite und Höhe des Bildes der Speicherplatz zu klein ist.(OutOfMemoryError: Java heap space)
Das benötigte Image ist leider 20x so groß, wie die maximal zulässige Breite/Höhe Bildhöhe in Java.
Ich habe keine Möglichkeit gefunden mehrere Bilder mit verschiedenen Anfangskoordinaten zu erzeugen.

Hier der Quellcode:

k++;
w=15500;h=870;
benötigt:w=30000; h=9000;
BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
drawingPane.paint(g2);
g2.dispose();
ImageIO.write(image, "jpg", new File(k+"-example.jpg"));

bischi
25-10-2006, 15:53
1) Hast du einen Media-Tracker drin? Wenn ja, dann unbedingt die Bilder wieder wegnehmen (sonst gibts Speicherlöcher)

2) Von Hand bei Programmstart den Heap vergrössern - vgl: http://www.mrunix.de/forums/showthread.php?t=45471

MfG Bischi

Jana
25-10-2006, 18:20
Sorry, so fortgeschritten bin ich noch nicht.
(...ansonsten kannst du mit dem CL-Parameter -Xmx000M die maximale Größe des von der VM verwendeten Speichers einstellen, wobei 000 natürlich mit einer entsprechenden Zahl substituiert werden muss.)
Kannst du mir das bitte genau erklären?

Ein Problem bleibt allerdings. JPG-Bilder können nicht größer wie 15 m sein.
Deshalb müßte ich das Bild in jedem Fall teilen.

bischi
25-10-2006, 18:31
Sorry, so fortgeschritten bin ich noch nicht.
(...ansonsten kannst du mit dem CL-Parameter -Xmx000M die maximale Größe des von der VM verwendeten Speichers einstellen, wobei 000 natürlich mit einer entsprechenden Zahl substituiert werden muss.)
Kannst du mir das bitte genau erklären?
Jepp:

zum Ausführen deines Programmes gibst du ja jeweils ein:


java MeinProgramm

neu jetzt halt:


java -Xms100m -Xmx200m MeinProgramm

will heissen: Am Anfang 100MB, maximal 200MB Speicher für Java-Heap.



Ein Problem bleibt allerdings. JPG-Bilder können nicht größer wie 15 m sein.
Deshalb müßte ich das Bild in jedem Fall teilen.
Und was ist konkret das Problem? Ich persönlich würde das Bild in mehrere Quadrate aufteilen, bei jedem Zugriff prüfen, welches der Quadrate du brauchst (ev. mehrere) und nachher nur spezifisch diese laden. Wenn du ne gute Performance brauchst, die Bilder halt vorher laden. Oder eine stark komprimierte Version für die Grossansicht und gute Qualität nachladen für Details... Ohne mehr Info kann ich leider nicht weiterhelfen :D

MfG Bischi

anda_skoa
25-10-2006, 19:47
Und was ist konkret das Problem? Ich persönlich würde das Bild in mehrere Quadrate aufteilen, bei jedem Zugriff prüfen, welches der Quadrate du brauchst (ev. mehrere) und nachher nur spezifisch diese laden

Ich denke das war zu einem gewissen Teil in Janas erstem Posting als Frage enthalten:
kann man auf einer Bilddatei nur einen bestimmten Bereich laden?

Ciao,
_

falke2203
25-10-2006, 21:04
Mit Java-Bordmitteln? Nicht das ich (spontan) wüsste. Grundsätzlich? Klar :) Die Frage ist einfach nur, wie viel Zeit man (oder in diesem Fall frau) investieren möchte.
Eine andere Frage, die sich mir beim Lesen dieses Threads stellt ist: Wofür (zur Hölle *g*) brauchst du ein Bild, dass bei einer Auflösung von 1280 x 1024 über mehr als 23 Bildschirmbreiten und knapp 9 Bildschirmhöhen geht???
Auch wenn es dir für dein konkretes Problem wahrscheinlich wenig hilft, ich muss dabei an ein Szenario für eine mögliche Implementierung denken, in dem irgendwie viele Rechner eine Rolle spielen :)

Jana
25-10-2006, 21:14
Die Heap-Size zu erhöhen wäre sehr komfortabel, denn damit habe ich ständig Probleme.
Ich benutze Eclipse. Im Help Manual habe ich nur gefunden, daß man unter Run -> (x)=Arguments den Heap Size verändern kann.
Aber es steht nicht da wie. :eek:

Ich möchte von meinem per Java erzeugten File ein jpg-Bild herstellen.
(So eine Art größeren Screenshot) Das File hat eine Breite von 30m und eine Höhe 0,9m.
Mit einem JPG-Bild komme ich nicht aus, denn die maximale Breite von JPG-Bildern ist 15m.

In meinem Code kann ich aber nur Höhe und Breite des Bildes eingeben, aber nicht die Anfangskoordinaten für das zu erstellende Bild.
Im Internet habe ich nichts gefunden.

BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
drawingPane.paint(g2);
g2.dispose();
ImageIO.write(image, "jpg", new File(k+"-example.jpg"));


Das ganze ist eine Zeichnung, die mittlerweile ziemliche Dimensionen angenommen hat.
Aber ich zweifle langsam, ob Java die richtige Programmiersprache ist.

anda_skoa
26-10-2006, 00:28
Damit ich das richtig verstehe:

das Ausgangsmaterials ist eine Folge von Zeichenbefehlen, die du jetzt mit Hilfe eines BufferedImage (weil das einen Graphics Context erzeugen kann) in eine Bildatei "reinzeichnen" möchtest. Korrekt?

Ciao,
_

Jana
26-10-2006, 06:47
Ja, das ist korrrekt.
Allerdings ist das kein riesiges Projekt. Nur in einer "Zeile" wird die Grafik extrem breit.

Jana
26-10-2006, 07:18
Den Heap-Space habe ich jetzt in Eclipse vergrößert.
Unter Run -> (x)=arguments -> VM arguments -> -Xmx256M eintragen.
Das ist offensichtlich das Maximum.

anda_skoa
26-10-2006, 13:27
Das ist offensichtlich das Maximum.

Unwahrscheinlich, Java Serveranwendungen müssen auch mehrere GB Speicher benutzen können.

Eventuell mal die Servervariante der VM starten.

Ciao,
_

anda_skoa
26-10-2006, 13:32
Ja, das ist korrrekt.
Allerdings ist das kein riesiges Projekt. Nur in einer "Zeile" wird die Grafik extrem breit.

Wenn du ein externes Programm findest, das Einzelbilder zu einem Gesamtbild zusammenfügt, könntest du immer nur Bereiche zeichnen, praktisch gekachelt.

Aber was ganz anderes: wenn das eine Zeichnung ist, dann ist JPG eine äußerst schlechte Wahl. JPG ist auf fotoähnliche Inhalte ausgelegt, d.h. es werden Annahmen über Zusammenhänge von Pixel getroffen, die in einer Zeichnung nicht nur nicht gegeben sind, sondern zu Artefakten führen, also künstlichen Störungen.

Für Zeichnungen jeder Art, zB auch Comics, wird daher praktisch immer ein verlustloses Format wie PNG benutzt.

Ciao,
_

Jana
26-10-2006, 15:46
Nun ja, es war ja meine Idee mehrere Bilder zu erzeugen.
Nur weiß ich nicht wie!
Da suche ich den Quellcode!

anda_skoa
26-10-2006, 16:30
Den Graphics Context transformieren, so daß sein Koordinatenursprung anders liegt

translate() oder so ähnlich

Ciao,
_

Jana
26-10-2006, 17:35
Toll, es scheint zu funktionieren.


if(source == make_PNG){
try {
k++;
w=10000;h=8000;
BufferedImage image = new BufferedImage(w, h,BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = image.createGraphics();
g2.translate(-10000, 0);
drawingPane.paint(g2);
g2.dispose();
ImageIO.write(image, "png", new File(k+"-example.png"));

} catch (Exception e){//catch (IOException e) {
System.err.println(e);
}
}

falke2203
27-10-2006, 06:38
Wenn es um das Aufteilen eines Bildes geht, solltest du dir vielleicht mal die Raster (http://java.sun.com/j2se/1.5.0/docs/api/java/awt/image/Raster.html)-Technik von Java anschauen. Ich habe da zwar selber noch nicht mit gearbeitet, der Beschreibung nach sollte es aber in die Richtung gehen, wo du hin willst...