Imagens, para serem manipuladas, devem ser descompactadas na memória. Por padrão, é o que o BufferedImage faz. Então, uma imagem, pode sim, ficar muito grande depois de aberta.
Em todo caso, seria bom usar o Visual VM para ver se a causa é realmente essa, ou se sua aplicação não está fazendo alguma caca. https://visualvm.dev.java.net/
Use também o parâmetro da VM:
-XX:HeapDumpOnOutOfMemoryError
Para gerar um dump da sua memória antes do erro ocorrer. Esse dump pode ser aberto e analisado no Visual VM.
[quote=jonathanprogrammer]A idéia principal é que ela abre em +/- 240 mb…
Teria como ela não abrir em memória e sim apenas ser uma visualização dela ?
Um jeito de que ela não alocasse esses 240mb e sim apenas os 80 default do java?
Se eu pegar e adicionar os -Xmx512mb digamos, a aplicação roda normal, mas deixa ela usando 240 mb da memória não é nada util!!
Hehe
Se alguém souber uma resolução mais agradavel fora alocar mais memória?!
Valeu desde já,
Jonathan Souza Santos [/quote]
Tudo que você vê no monitor está carregado na ram convecional ou na ram da sua placa de vídeo.
A pilha do windows suporta 8 megas. Se você empilhou uma imagem maior que isso no heap já está errado.
Alguns tipos de imagens são em “tiles” (como o TIFF) e permitem que você edite apenas uma “tile” dela, ou seja, uma porção, não a imagem completa, para evitar esse tipo de problema (gastar uma quantidade excessiva de memória).
[quote=juliocbq]Tudo que você vê no monitor está carregado na ram convecional ou na ram da sua placa de vídeo.
A pilha do windows suporta 8 megas. Se você empilhou uma imagem maior que isso no heap já está errado. [/quote]
A imagem é de 1mb mais ou menos, o programa não carrega mais de 2mb de imagem…
O problema é que ta sendo ocupado 240mb de ram pra executar a imagem! e com isso fica pesado o programa.
Gostaria apenas visualizar a imagem, sem usar 240mb…
[quote=entanglement]Alguns tipos de imagens são em “tiles” (como o TIFF) e permitem que você edite apenas uma “tile” dela, ou seja, uma porção, não a imagem completa, para evitar esse tipo de problema (gastar uma quantidade excessiva de memória).
Veja os métodos do JAI. [/quote]
Na real a edição eu deixaria mais pra frente, a necessidade principal é abri um imagem e visualizar ela sem ocupar 240mb de memoria…
[quote=jonathanprogrammer][quote=entanglement]Alguns tipos de imagens são em “tiles” (como o TIFF) e permitem que você edite apenas uma “tile” dela, ou seja, uma porção, não a imagem completa, para evitar esse tipo de problema (gastar uma quantidade excessiva de memória).
Veja os métodos do JAI. [/quote]
Na real a edição eu deixaria mais pra frente, a necessidade principal é abri um imagem e visualizar ela sem ocupar 240mb de memoria…[/quote]
Dica: use um programa (como o ImageMagick, que tem interfaces em Java para você usar) que pegue a tal imagem e a converta para uma imagem menor, que você possa carregar sem estourar sua memória.
Para carregar uma imagem em algum formato de compressão, vc precisa decodifica-la, e da mesma forma vai ocupar memoria.
Sem ver o código não dá para ajudar.
Digamos que você queira editar uma imagem gerada por uma câmera digital de 12 megapixels, ou seja, essa imagem deve ocupar 12 * 1000000 * 4 bytes = 48 Megabytes em memória se você usar 32 bits por pixel (o que não é tão impossível assim - vários formatos usam exatamente esse layout).
Normalmente você não carrega a imagem inteira na memória FÍSICA, e sim cria uma espécie de “memória virtual” onde só uma subimagem dessa imagem total é que fica presente na memória.
Para fazer esse tipo de coisas, você precisa de uma biblioteca poderosa, normalmente fornecida por terceiros e que costuma funcionar melhor com outras linguagens, não Java.
Se você, em vez disso, quiser fazer tudo isso do zero e sem pagar um tostão, precisa pelo menos usar uma biblioteca como a JAI - a Java ImageIO não é suficiente para o que você quer. No FAQ do JAI eles indicam o que fazer com imagens grandes.
o código não adianta eu te postar, senão vo posta muitas linhas :roll:
Mais se tu poder me dar uma referência teorica onde eu possa aplicar o que vocês estão me falando, fora as API que já mencionaram!
Valeu, [/quote]
O seu código está errado. Eu processo imagens de 8 mb/px usando filtros complexos em menos de 1s com java. E uma imagem de 8mbpx possui mais de 2000px de largura e altura.