Toon posts:

[java/swing]strategiën voor foto beheer programma

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
In swing ben ik bezig aan een klein programma. De bedoeling is dat je vanuit je explorer/iView/finder of Iphoto je foto's sleept naar de applicatie naar een bepaald JPanel. Je hebt 8 bestaande JPanels (deze stellen elk een categorie voor).
Afbeeldingslocatie: http://users.pandora.be/sgweb/voorbeeld.JPG

In de foto zie je maar één JPanel. de andere komen hier onder te staan

Nu is elke foto ongeveeer 3 à 5 MB groot. Deze wordt verkleind weergeven door de volgende regels code:
code:
1
2
3
4
5
public void addImage(Image image){
        Image small =image.getScaledInstance(100,100,Image.SCALE_FAST);       
        JLabel label = new JLabel(new ImageIcon(small));        
        add(label);
}


Uiteraard was ik na het toevoegen van 5 foto's al in de problemen:
[code]
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
Exception in thread "Image Fetcher 0" java.lang.OutOfMemoryError: Java heap space
[code]

Nu kan ik java wel starten maar met een grotere Heap memory. Uiteraard lost dit geen problemen op, want als je met 5 foto's al tekort komt voor enkele mb.. laat staan dat ik dan 100 à 300 foto's kan inladen!

mijn oplossing:
Misschien moet ik een temp map maken, al de thumnails wegschrijven en de orginele uit het geheugen laden: nadeel: schrijf access
Misschien moet ik de thumbs in het geheugen laten staan en de orginele uit het geheugen gooien. alleen bij het openen van een specifieke foto kan ik de hele foto weer inladen

Ik heb hier totaal geen ervaring mee dus kan iemand andere oplossingen / strategiën voorstellen en ook al tips geven om mij hier op weg te zetten
(want de thumbnail in het geheugen laten en da image verwijderen weet ik niet echt hoe ik dat moet doen? moet je dan manueel je gb.collect doen?)

[ Voor 3% gewijzigd door Verwijderd op 01-03-2006 18:18 . Reden: layout ]


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 09-04 14:46
Alleen thumbnails in het geheugen houden (en bij de thumbnail de bestandsnaam van het origineel) lijkt me het meest logische. Hiervoor moet je gewoon zorgen dat er geen referenties meer zijn naar het Image object van het origineel, de garbage collector moet deze dan automatisch opruimen.

Misschien kan je als alternatief ook Image.flush() op het origineel proberen?

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Java heeft geavanceerde mogelijkheden met betrekking tot garbage collection. Namelijk in de vorm van strong, weak, bla en phantom references. Deze worden normaal gesproken voor dergelijke zaken. Caching van plaatjes in fotobewerkingsprogramma's.

Ik heb er alleen 1 pagina over gelezen in een certified programmer boek en weet er verder ook niks van, maar op internet is vast wel iets te vinden. De drie namen die ik hiervoor noemde (strong, weak en phantom references) kloppen, de laatste naam weet ik niet meer.

Vanuit 10 kilometer perspectief willen deze soorten referenties zeggen dat ze indien nodig zo opgeruimd kunnen worden in tegenstelling tot standaard referenties. Dus, geheugen vol, referentie automatisch weggegooid.

Het maakt denk ik je applicatie wel complexer, maar is wel de gangbare oplossing.

Fat Pizza's pizza, they are big and they are cheezy


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09-04 20:11

Robtimus

me Robtimus no like you

JKVA schreef op donderdag 02 maart 2006 @ 11:47:
Java heeft geavanceerde mogelijkheden met betrekking tot garbage collection. Namelijk in de vorm van strong, weak, bla en phantom references. Deze worden normaal gesproken voor dergelijke zaken. Caching van plaatjes in fotobewerkingsprogramma's.

Ik heb er alleen 1 pagina over gelezen in een certified programmer boek en weet er verder ook niks van, maar op internet is vast wel iets te vinden. De drie namen die ik hiervoor noemde (strong, weak en phantom references) kloppen, de laatste naam weet ik niet meer.

Vanuit 10 kilometer perspectief willen deze soorten referenties zeggen dat ze indien nodig zo opgeruimd kunnen worden in tegenstelling tot standaard referenties. Dus, geheugen vol, referentie automatisch weggegooid.

Het maakt denk ik je applicatie wel complexer, maar is wel de gangbare oplossing.
java.lang.ref package.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
matthijsln schreef op woensdag 01 maart 2006 @ 23:11:
Alleen thumbnails in het geheugen houden (en bij de thumbnail de bestandsnaam van het origineel) lijkt me het meest logische. Hiervoor moet je gewoon zorgen dat er geen referenties meer zijn naar het Image object van het origineel, de garbage collector moet deze dan automatisch opruimen.

Misschien kan je als alternatief ook Image.flush() op het origineel proberen?
beide functies werken niet. Mijn geheugen stijgt van 17 van 34mb bij het inladen van 1 foto.
nadat ik image.flush; image =null; System;gc(); heb gedaan nog steeds.

Heeft er iemand ervaring met Java Advanced Imaging (JAI) API ? http://java.sun.com/products/java-media/jai/index.jsp

  • Johnny
  • Registratie: December 2001
  • Laatst online: 09:19

Johnny

ondergewaardeerde internetguru

Ik denk dat je op zoek bent naar het proxy patroon, je maakt een object dat je afbeelding voorstelt, maar deze pas in het geheugen laadt op het moment (of vlak voor) dat hij op het scherm moet komen te staan.

Verder zal je toch de maximumlimiet van het geheugen ook moeten ophogen, want de 64MB die Java standaard gebruikt is gewoon te weinig voor een foto-applicatie.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 09-04 14:46
Verwijderd schreef op zondag 05 maart 2006 @ 09:57:
[...]
beide functies werken niet. Mijn geheugen stijgt van 17 van 34mb bij het inladen van 1 foto.
nadat ik image.flush; image =null; System;gc(); heb gedaan nog steeds.
De JVM geeft dan wel geen geheugen terug aan het besturingssysteem, maar het kan wel weer gebruikt worden voor Java-objecten.

Start je programma maar eens met de "-verbose:gc" switch aan java, dan kan je zien dat de garbage collector dingen opruimt.

Met de "-Dcom.sun.management.jmxremote" switch voor java kan je met jconsole mooie grafiekjes van geheugengebruik zien.

  • Apache
  • Registratie: Juli 2000
  • Laatst online: 09-04 15:52

Apache

amateur software devver

de getScaledImage mag je niet gebruiken volgens Guy Romain, das toch wat hij ons wijsmaakte tijdens een presentatie op javapolis :)

Hij demo'de daar een application die ook met foto's werkte en thumbs ervan etc, misschien de moeite waard om eens te bekijken, ik kan me niet meteen meer herinneren hoe hij de foto's dan wel schaalde, maar hier heb je een link naar zijn blog waar wel vaak nuttige links & source te vinden zijn: http://www.jroller.com/page/gfx

Verder kan je ook eens naar Java 1.6 kijken als je met photo's ed aan de slag gaat, daar zou een enorme snelheidswinst geboekt zijn op dat vlak.

If it ain't broken it doesn't have enough features


Verwijderd

Topicstarter
Ik heb de dvd van javapolis van 2004 denk ik, staat deze presentatie hier op?

Verwijderd

Topicstarter
http://www.darcynorman.ne...magemagick-image-resizing
Ik denk dat ik maandag avond hiermee eens ga experimenteren:
Jmagic is een implementatie van het framework voor java. Het schijnt veel minder geheugen in te nemen.

  • Donderwolk
  • Registratie: Januari 2002
  • Laatst online: 14-01 21:59
Ik denk dat je eens naar de javax.imagio package wil kijken en dan met name naar de IIOImage klasse.

http://java.sun.com/j2se/...vax/imageio/IIOImage.html

Kijk ook hier voor wat meer voorbeelden:
http://java.sun.com/produ...avaOne2001/600/index.html

Pwnd

Pagina: 1