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