thumbnailator 图片缩放问题

这段代码上传1.7m图片会报错:

public static final boolean scale(File sourceImage, File targetImage, double maxWidth, ImageCropVO cropVO) {
	    
	   targetImage.getParentFile().mkdirs();
		boolean result = false;
		try {
			int width = 0;
			int height = 0;
			//crop image
//			BufferedImage bufferImg = Thumbnails.of(sourceImage).scale(1.0).asBufferedImage();
			BufferedImage bufferImg = ImageIO.read(sourceImage);
			double rate = 0.0;
			int maxTmpWidth = bufferImg.getWidth();
			if (maxTmpWidth > maxWidth){
				rate = maxWidth/maxTmpWidth;
				//此处上传超过1.1m的图片可能报错java.lang.OutOfMemoryError
				Thumbnails.of(sourceImage).scale(rate).toFile(targetImage);
				
				width = (int)(bufferImg.getWidth()  * rate);
				height = (int)(bufferImg.getHeight()  * rate);
				cropVO.setTargetWidth(width);
				cropVO.setTargetHeight(height);
			}
//			int maxTmpLength = bufferImg.getWidth()> bufferImg.getHeight() ? bufferImg.getWidth(): bufferImg.getHeight();
//			if (maxTmpLength > maxLength){
//			    rate = maxLength/maxTmpLength;
//			    Thumbnails.of(sourceImage).scale(rate).toFile(targetImage);
//			    
//			    width = (int)(bufferImg.getWidth()  * rate);
//			    height = (int)(bufferImg.getHeight()  * rate);
//			    cropVO.setTargetWidth(width);
//			    cropVO.setTargetHeight(height);
//			}
			else{
			    String extention = FileHelper.getExtension(targetImage, "");
			    ImageIO.write(bufferImg, extention, targetImage);
				//sourceImage.renameTo(targetImage);
				width =bufferImg.getWidth();
				height =bufferImg.getHeight();
				
				cropVO.setTargetWidth(width);
				cropVO.setTargetHeight(height);
			}
			result = true;
		} catch (Exception e) {
			LogHelper.error("Exception to resize image", e);
		}
		return result;
	}
 
java.lang.OutOfMemoryError: Java heap space
	at java.awt.image.DataBufferByte.<init>(DataBufferByte.java:42)
	at java.awt.image.Raster.createInterleavedRaster(Raster.java:253)
	at java.awt.image.BufferedImage.<init>(BufferedImage.java:368)
	at net.coobird.thumbnailator.resizers.ProgressiveBilinearResizer.resize(Unknown Source)
	at net.coobird.thumbnailator.resizers.Resizers.resize(Unknown Source)
	at net.coobird.thumbnailator.makers.ThumbnailMaker.makeThumbnail(Unknown Source)
	at net.coobird.thumbnailator.makers.ScaledThumbnailMaker.make(Unknown Source)
	at net.coobird.thumbnailator.Thumbnailator.createThumbnail(Unknown Source)
	at net.coobird.thumbnailator.Thumbnails$Builder.toFile(Unknown Source)
	at com.bitbao.common.lib.image.ImageHelper.scale(ImageHelper.java:73)
	at com.bitbao.cm.controller.web.AccountSettings.saveSelfStylePhoto(AccountSettings.java:822)
	at com.bitbao.cm.controller.web.AccountSettings.processSaveTempPoto(AccountSettings.java:757)
	at com.bitbao.cm.controller.web.AccountSettings.saveTempPhoto(AccountSettings.java:727)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:185)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:100)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:502)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:465)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:863)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:851)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:767)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)

查明原因之后发现,原来设置的-Xmx 不够大,总感觉thumbnail 性能方面不行。有搞过图片缩放的高手们指点下,有没有好的方式或者别的插件?

猜你喜欢

转载自woshixushigang.iteye.com/blog/1634984