这段代码上传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 性能方面不行。有搞过图片缩放的高手们指点下,有没有好的方式或者别的插件?