迷彩风情的gravatar头像
迷彩风情 2016-08-31 12:14:28

为什么java BufferedImage类处理大图直接抛出内存溢出的异常?

public static void mergeImage(int rows,int cols,File[] imgFiles,int classroomId) throws IOException {  
		
		HttpServletRequest request = ServletActionContext.getRequest();
	    int chunks = rows * cols;  
	    int chunkWidth, chunkHeight;  
	    int type;  
	    //读入小图  
	    /*File[] imgFiles = new File[chunks];  
	    for (int i = 0; i < chunks; i++) {  
	        imgFiles[i] = new File("D:/QRCode/" + i + ".png");  
	    }  */
	    //创建BufferedImage  
	    BufferedImage[] buffImages = new BufferedImage[chunks];  
	    for (int i = 0; i < chunks; i++) { 
	        buffImages[i] = ImageIO.read(imgFiles[i]);
	    }  
	    type = buffImages[0].getType();  
	    chunkWidth = buffImages[0].getWidth();  
	    chunkHeight = buffImages[0].getHeight();  
	  
	    //设置拼接后图的大小和类型  
	    BufferedImage finalImg = new BufferedImage(chunkWidth * cols, chunkHeight * rows, type);  
	  
	    //写入图像内容  
	    int num = 0;  
	    for (int i = 0; i < rows; i++) {  
	        for (int j = 0; j < cols; j++) {  
	            finalImg.createGraphics().drawImage(buffImages[num], chunkWidth * j, chunkHeight * i, null);  
	            num++;  
	        }  
	    } 
	    String separator = File.separator;
	    String path = request.getSession().getServletContext().getRealPath("/QrCode");
	    path += separator+classroomId+".png";
	    //输出拼接后的图像  
	    ImageIO.write(finalImg, "png", new File(path));  
	  
	}  
所有回答列表(2)
遇见,的gravatar头像
遇见,  LV36 2016年8月31日

之前做过水印图片 图片大的时候很占内存  如果再加上很多人一起用 服务器直接DOWN了

改用阿里云把或者七牛

yjx4510013的gravatar头像
yjx4510013  LV9 2016年8月31日

显示一张大图片,和,显示多张图片的时候,BufferedImage 必然有内存溢出的风险。
因为,你所有压缩格式的图片,都被转换成像素点阵,存放到内存当中,这个是非常消耗资源的。
而且,BufferedImage 设计这个类的目的,主要是为了,显示小图标,一般都是64X64像素的图片,
要是操作大的图片,要么,每次处理一张(不要过大),

jdk7中,关于imageIO在线程池中并发使用时,会出现一些问题。

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友