2014-01-31 16 views
1

今天我正在玩一種方法,它裁剪和調整分辨率爲3264x2448的圖像。有限的堆空間的java圖像處理

JVM的堆空間長度僅爲64mb。

我總是得到「內存泄漏」當我使用方法加載此圖像:

BufferedImage bImage = ImageIO.read(stream); 

還有其他的方式來調整它走在內存泄漏沒有,或者唯一的問題是小尺寸堆空間?

這張圖片的大小爲3mb,爲什麼它需要50mb的堆空間?

由於提前,對不起,如果我的問題是愚蠢的,但對我來說

奇怪Byee

回答

1

前段時間我很掙扎with the same question。我可能會說,這是一個艱難的時刻,試圖將圖像加載到內存中,因爲對於圖像的實際大小沒有限制。所以,我使用Image Magic解決方案。它有它自己的缺點:當它必須使用大圖像時(但我認爲它可以調整,實際上沒有花費太多時間),它消耗了我很多的PC資源。

基本上,如果最終你不需要將圖像加載到Java代碼中(例如預覽),那麼圖像魔法就是非常好的解決方案。如果你還需要預覽才能顯示給用戶,那麼我使用外部程序來打開一個圖像(或者我的例子中實際上是PDF,但我認爲你可以使用默認的OS圖像查看器)。

+1

非常感謝您的回答,我已閱讀您的文章,但我的方法運行在Tomcat的servlet上。我可以使用Image Magic?這是一個圖書館,或者我需要像安裝程序一樣安裝它? –

+0

Eeverything是可能的:) ImageMagic只是一組命令行/ shell工具。如果你在服務器上安裝它,你可以從servlet執行它。 http://stackoverflow.com/questions/15847231/processbuilder-start-returns-0-but-doesnt-execute-shell-script –

+0

「萬事皆有可能」好答案:D所以「圖像魔術師」不要使用堆空間,所以我可以通過槽內存泄漏?唯一的問題是,如果託管可以安裝該工具嗎? –

1

1)在文件中的圖像大小爲結構化數據的大小,壓縮(例如,在jpeg格式)文件在磁盤上。

2)內存中的數據是圖像的對象表示,因此它可能比文件中的圖像資源大得多。

3)沒有辦法在不增加內存空間的情況下解決問題。看看這個:What does Java option -Xmx stand for?

+0

非常感謝您的回答,你已經證實了我擔心:)。這個方法在tomcat中運行,並從窗體中獲取圖像,如果大小超過2mb,有什麼辦法阻止這個圖像的上傳? –

+0

@AndreaCatania當然。看看這個答案:http://stackoverflow.com/questions/8091428/setting-file-size-restrictions-when-uploading-files-with-jersey它是關於'球衣',但答案可以應用於'tomcat '也是。 – Andremoniy

+0

哦!不錯,但是如何在達到最大尺寸限制後停止上傳?我可以使用「圖像魔術」來避免這個問題嗎? –

1

這張圖片的大小是3mb,爲什麼它需要50mb的堆空間?

圖像被壓縮,在內存中解壓縮,這意味着你的情況:

3264 * 2448 * 4 = 31 MB // 4 byte per pixel