Anzeige:
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16

Thema: Fileimage erzeugen

  1. #1
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337

    Fileimage erzeugen

    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"));

  2. #2
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    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

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  3. #3
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337
    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.

  4. #4
    Registrierter Benutzer Avatar von bischi
    Registriert seit
    10.04.2003
    Beiträge
    4.828
    Zitat Zitat von Jana Beitrag anzeigen
    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:

    Code:
    java MeinProgramm
    neu jetzt halt:

    Code:
    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

    MfG Bischi
    Geändert von bischi (25-10-2006 um 18:33 Uhr)

    "There is an art, it says, or rather, a knack to flying. The knack lies in learning how to throw yourself at the ground and miss it" The hitchhiker's guide to the galaxy by Douglas Adams

    --> l2picfaq.pdf <-- www.n.ethz.ch/~dominikb/index.html LaTeX-Tutorial, LaTeX-Links, Java-Links,...

  5. #5
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von bischi Beitrag anzeigen
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  6. #6
    Registrierter Benutzer
    Registriert seit
    07.08.2006
    Beiträge
    101
    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

  7. #7
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337
    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.

    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.
    Geändert von Jana (25-10-2006 um 21:17 Uhr)

  8. #8
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  9. #9
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337
    Ja, das ist korrrekt.
    Allerdings ist das kein riesiges Projekt. Nur in einer "Zeile" wird die Grafik extrem breit.

  10. #10
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337
    Den Heap-Space habe ich jetzt in Eclipse vergrößert.
    Unter Run -> (x)=arguments -> VM arguments -> -Xmx256M eintragen.
    Das ist offensichtlich das Maximum.

  11. #11
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Jana Beitrag anzeigen
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  12. #12
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Jana Beitrag anzeigen
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  13. #13
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337
    Nun ja, es war ja meine Idee mehrere Bilder zu erzeugen.
    Nur weiß ich nicht wie!
    Da suche ich den Quellcode!

  14. #14
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Den Graphics Context transformieren, so daß sein Koordinatenursprung anders liegt

    translate() oder so ähnlich

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  15. #15
    Registrierter Benutzer
    Registriert seit
    27.08.2002
    Beiträge
    337
    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);
    }
    }

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •