Avatar billede mergelspir Seniormester
30. april 2021 - 14:14 Der er 8 kommentarer

BufferedImage og ImageIO.read hænger

BufferedImage newImage = new BufferedImage(height, width, imagetype);
og
ImageIO.read()
returnerer ikke, hvis billedet er for stort.

Jeg har ikke undersøgt vældig mange billeder, men små billeder er ok, og store billeder giver problemer.
Eksempel på lille billede: 89KB, (500 x 375) px
Eksempel på stort billede: 2265KB, (3264 x 2448) px
Begge er JPEG.
(Jeg bruger Java 1.7)

Runtime.getRuntime().freeMemory() returnerer 40MB.
3264 x 2448 x 4 = 32MB, så det burde vel være ok?

Eller er der andet, jeg skal være opmærksom på?!?

(Det ville have været rart, hvis ImageIO kastede en exception, i mangel af resourcer)
Avatar billede arne_v Ekspert
30. april 2021 - 14:30 #1
JPEG er komprimeret og det er meget muligt at billedet skal læses ind i memory ukomprimeret,


Hvad er Xmx?

Har du prøvet -Xmx1G bare for at se omd et hjælper.
Avatar billede mergelspir Seniormester
30. april 2021 - 15:27 #2
Ja JPEG er komprimeret, så billedet med filstørrelsen 2265KB, vil vel fylde 3264 x 2448 x 4 = 32MB i memory.

Med hensyn til Xmx:
Runtime.getRuntime().maxMemory() returnerer: 96993280

Jeg har ikke umiddelbart mulighed for at ændre på Xmx, da den parameter er sat af mit webhotel (Levonline.com)
Avatar billede arne_v Ekspert
30. april 2021 - 16:01 #3
Ah. Nu kan jeg huske det tidligere spørgsmål.

ImageIO må gøre noget ret ineffektivt.

I sidste spørgsmål foreslog jeg ImageJ og ImagePlus klassen. Har du prøvet om den kan læse den 2.2 MB JPEG?
Avatar billede mergelspir Seniormester
30. april 2021 - 20:39 #4
#3
Nej, det har jeg ikke.
Jeg undersøgte, hvor ofte Andy Warhol problemet opstår, og det er i 1 promille af alle billederne, så jeg besluttede at flytte det langt ned på min prioriteringsliste.
Derudover er der to grunde til ikke at benytte ImageJ og ImagePlus:
1) footprint
2) det er ikke standard Java, dvs. en extern afhængighed.

Jeg forventer, at mit webhotel på et eller andet tidspunkt opgraderer til en nyere version end 1.7, og så vill dette Andy Warhol problem løse sig selv.

Jeg er også ved at kikke efter andre Java webhoteller, men de hænger ikke på træerne.
Avatar billede arne_v Ekspert
30. april 2021 - 20:55 #5
Google app engine understøtter Java 8 og 11 plus servlet 2.5 og 3.1.
Avatar billede arne_v Ekspert
30. april 2021 - 20:59 #6
Men der er vel kun 2 mulige workarounds i det nuværene miljø:
1) et eksternt librray som virker bedre
2) restriktion på billedstørrelse
Avatar billede mergelspir Seniormester
01. maj 2021 - 20:22 #7
#6
Jeg har i øjeblikket ristriktioner på filstørrelsen, men vil gerne lave det om til restriktioner på billedstørelsen.

Problemet er, at jeg kan sagtens uploade store filer til webserveren, men hvis et billede er for stort, så hænger programmet, når jeg læser billedet ind fra filen via ImageIO.read(). Og det kræver at jeg læser billedet ind for at kunne se billedstørrelsen, så det er en Catch 22.

Alternativet er at skrive et program, der læser starten af en fil ind for at finde billedstørrelsen. Den løsning har jeg kikket på, men det er kompliceret, da brugeren skal have mulighed for at oploade forskellige billedformater, JPEG, GIF, osv.
Avatar billede mergelspir Seniormester
01. maj 2021 - 20:25 #8
#5
Jeg har nu kikket på Google app engine, og prisstrukturen er meget præcis men komplet uigennemskuelig. Hos mit nuværende webhotel, er der flat rate. dvs. uafhængig af belastning, storage og trafik.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester