[Java/Applet] Enorm JPG bestand lezen?

Pagina: 1
Acties:

  • SilverMane
  • Registratie: Mei 2000
  • Laatst online: 22:49
Hallo,
Ik ben bezig met een project om grote JPG bestanden weertegeven in een java applet.
Nu heb ik al een java applet gemaakt om "gewone" < 3 MB JPG bestanden te openen,
en dat werkt allemaal prima. Maar nu wil ik grotere +- >100 MB JPG bestanden openen.

Is er een handige manier om zulke bestanden maar deels te openen, en dan weertegeven?

Ik heb overal gezocht maar kan nergens iets over vinden.
Alvast bedank _/-\o_ :D

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc


  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22-04 03:55

Nick_S

++?????++ Out of Cheese Error

Heb je al naar de Image IO packages gekeken? Ik weet niet of ze doen wat je wil, maar dat is het eerste wat ik even tegenkom in de 1.4.2 API.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


  • SilverMane
  • Registratie: Mei 2000
  • Laatst online: 22:49
Ja, daar heb ik al naar zitten kijken.

maar als je bv. het volgende doet:
PHP:
1
2
3
File f = new File("c:\\Plaatjes\\scan1.jpg"); 
                
BufferedImage hoi = ImageIO.read(f);


Dan krijg je een:
java.lang.IllegalArgumentException: Array size > Integer.MAX_VALUE

Wat natuurlijk niet gek is.
Maar hoe zou ik hem wel kunnen openen.
Iemand?

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc


  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Welke afmetingen heeft zo'n jpegje van 100 MB eigenlijk? Is zoiets meer dan 2,1 miljard pixels breed/hoog?

Als je met zulke hoeveelheden data bezig bent is het ook raadzaam om de VM wat meer geheugen te geven, dus je programma/applet opstarten met java -Xmx256M oid. Al duidt Array size > Integer.MAX_VALUE nou niet direct op een geheugenprobleem natuurlijk.
Ook zou ik eerder geneigd zijn om een applicatie te maken in plaats van een applet, al is dat misschien een verkeerde veronderstelling.


Nog even wat gezocht: voor hele grote plaatjes zou je de tiling faciliteiten van Java Advanced Imaging kunnen gebruiken. Met tiles kun je een (groot) plaatje in stukjes inladen.

JadeDisplay is een 'high-performance image display component for serious imaging applications using JAI (Java Advanced Imaging)' oftwel een behoorlijke 'wrapper' om JAI heen. Het is alleen wel lastig te verkrijgen zie ik nu pas weer, je moet er vanuit de VS een fax voor versturen bijvoorbeeld. 8)7

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


  • Daos
  • Registratie: Oktober 2004
  • Niet online
In een jpeg wordt alle data gebruikt voor het comprimeren. Je hebt de hele jpeg nodig voordat een stukje eruit kan halen.

Kan je alleen een jpeg van >100 MB krijgen? Als je het plaatje anders kan krijgen, dan kan je het bijvoorbeeld op deze twee manieren oplossen:
1) Plaatje is in bestandsformaat zonder compressie (bv bmp, tga, raw). Je hoeft alleen het deel dat je nodig hebt uit te lezen. De nadelen hiervan zijn dat het bestand heel erg groot is en dat je waarschijnlijk zelf code zal moeten schijven die het juiste deel uit het bestand haalt.
2) Plaatje is gesplitst in kleine stukjes. Stukjes plak je dynamisch aan elkaar. Dit gaat snel, kost weinig geheugen en is relatief makkelijk te implementeren. Het enige nadeel is dat je bij een lossy compressie zoals jpeg soms de randen kan zien. Het beste kan er een lossless compressie gebruikt worden voor de plaatjes (bv gif, png, tiff).

In de praktijk wordt vrijwel altijd die 2e methode gebruikt. Dit is de "tiling" waar zwippie het ook al over had.