问题描述
importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics2D;importjava.awt.Image;importjava.awt.geom.AffineTransform;importjava.awt.image.AffineTransformOp;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjavax.imageio.ImageIO;importjavax.swing.ImageIcon;importcom.sun.image.codec.jpeg.*;/****Title:图片生成水印*Description:让图片生成水印的类*Date:2009-04-10*@authorHunter*@versionV1.0**//***给图片加文字水印的方法,传递五个参数SourceFile,destFile,markContent,markContentColor,qualNum*@paramSourceFile源图片名*@paramdestFile生成的文件名*@parammarkContent文字内容*@parammarkContentColor文字颜色*@paramqualNum图片质量*/publicclassJPGWaterMark{publicbooleancreateStringMark(StringsourceFile,StringdestFile,StringmarkContent,ColormarkContentColor,floatqualNum){ImageIconimgIcon=newImageIcon(sourceFile);ImagetheImg=imgIcon.getImage();intwidth=theImg.getWidth(null);intheight=theImg.getHeight(null);BufferedImagebimage=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);Graphics2Dg=bimage.createGraphics();g.setColor(markContentColor);g.setBackground(Color.white);g.drawImage(theImg,0,0,null);g.setFont(newFont(null,Font.BOLD,18));//字体,字型,字号g.drawString(markContent,width-170,height-15);//画文字g.dispose();try{FileOutputStreamout=newFileOutputStream(destFile);JPEGImageEncoderencoder=JPEGCodec.createJPEGEncoder(out);JPEGEncodeParamparam=encoder.getDefaultJPEGEncodeParam(bimage);param.setQuality(qualNum,true);encoder.encode(bimage,param);out.close();}catch(Exceptione){System.out.print("给图片加文字水印出现错误,"+e.toString());returnfalse;}returntrue;}}以上程序当图片比较小时不出现错误,当我处理一张分辨率为3072*2048的图片就出现错误,错误是内存方面的问题,请问高手如何解决?
解决方案
解决方案二:
设置系统环境变量JAVA_OPTS=-Xmx256m
解决方案三:
出现的错误是:严重:Servlet.service()forservletaddPicServletthrewexceptionjava.lang.OutOfMemoryError:Javaheapspaceatjava.awt.image.DataBufferInt.<init>(UnknownSource)atjava.awt.image.Raster.createPackedRaster(UnknownSource)atjava.awt.image.DirectColorModel.createCompatibleWritableRaster(UnknownSource)atjava.awt.image.BufferedImage.<init>(UnknownSource)atcom.util.JPGWaterMark.createStringMark(JPGWaterMark.java:50)atcom.servlet.addPicServlet.doGet(addPicServlet.java:76)atcom.servlet.addPicServlet.doPost(addPicServlet.java:102)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:710)atjavax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)atcom.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:24)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)atorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)atorg.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)atorg.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)atjava.lang.Thread.run(UnknownSource)我修改了环境变量还是出现问题?希望得到大家的帮助
解决方案四:
不知道你这个图片到底多大,我以前用jai做过水印,好像没什么问题,当然没有测试过超大图片
解决方案五:
我的图片分辨率是3076*2048的,图片小的倒不出什么问题.