項(xiàng)目需求:有很多尺寸很大的圖片(圖片大小可能幾十MB,甚至上百M(fèi)B),需要等比例縮小它們的尺寸,相當(dāng)于生成縮略圖。例如:原圖8268x6201,需要壓縮成400x300。我現(xiàn)在的方法:將圖片整個(gè)讀入內(nèi)存,然后修改寬、高,最后寫(xiě)回磁盤(pán)。核心代碼大概這樣:BufferedImage oldImg = ImageIO.read(in);
BufferedImage newImg = new BufferedImage(400, 300, BufferedImage.TYPE_INT_RGB);
Graphs2D g = newImg.createGraphics();
g.drawImage(oldImg, 0, 0, 400, 300, null);
g.dispose();
ImageIO.write(newImg, 'jpg', new BufferedStream(out));但是由于圖片本身很大,而且可能會(huì)同時(shí)有多個(gè)線程在轉(zhuǎn),所以頻繁發(fā)生內(nèi)存溢出,報(bào)錯(cuò):java.lang.OutOfMemoryError: Java heap space.嘗試:我試過(guò)增大分配給JVM的內(nèi)存,但是效果不明顯。首先機(jī)器內(nèi)存有限,不可能無(wú)限增加。而且圖片的大小沒(méi)有上限,所以此方法不能很好地解決問(wèn)題。理想的情況,應(yīng)該是通過(guò)一種“流式的算法”,一邊把原始圖片從磁盤(pán)讀到內(nèi)存,一邊修改尺寸,一邊寫(xiě)到磁盤(pán)生成目標(biāo)圖片。這種算法理論上只需要常數(shù)級(jí)內(nèi)存空間。不過(guò)我在網(wǎng)上找了很久也沒(méi)有找到。我對(duì)圖形學(xué)、圖片格式、圖片處理相關(guān)的知識(shí)不熟悉,不知道是否存在這樣的算法,以及Java是否支持這樣的算法。在此請(qǐng)教大家。
Java修改圖片尺寸,總是報(bào)內(nèi)存溢出怎么解決?
慕田峪7331174
2019-03-12 09:19:31