JavaEE 图片加水印

发布时间:2013-03-31作者: 邯郸翱翔

代码片段1importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjava
 
代码片段1
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletResponse;
import util.WaterMarkResponseWrapper;
/**
* Servlet Filter implementation class ImgFilter
*/

@WebFilter(filterName = "ImgFilter", urlPatterns = "*.jpg", initParams={@WebInitParam(name="waterMarkFile",  value="327.png")})
public class ImgFilter implements Filter {
   // 水印图片,配置在初始化参数中
   private String waterMarkFile;
   public void init(FilterConfig config) throws ServletException {
       String file = config.getInitParameter("waterMarkFile");
       waterMarkFile =config.getServletContext().getRealPath(file);
   }
   public void doFilter(ServletRequest req, ServletResponse res,
           FilterChain chain) throws IOException, ServletException {
       // 自定义的response
       WaterMarkResponseWrapper waterMarkRes = newWaterMarkResponseWrapper((HttpServletResponse)res, waterMarkFile);
       chain.doFilter(req, waterMarkRes);
       // 打水印,输出到客户端浏览器
       waterMarkRes.finishResponse();
   }
   public void destroy() {
   }
}
代码片段2
package util;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class ImageUtil {
   /**
    * 
    * @param imageData
    *            JPG 图像文件
    * @param waterMarkFile
    *            水印图片
    * @return 加水印后的图像数据
    * @throws IOException
    */

   public static byte[] waterMark(byte[] imageData, String waterMarkFile)
           throws IOException {
       // 水印图片的右边距 下边距
       int paddingRight = 10;
       int paddingBottom = 10;
       // 原始图像
       Image image = new ImageIcon(imageData).getImage();
       int imageWidth = image.getWidth(null);
       int imageHeight = image.getHeight(null);
       // 水印图片
       Image waterMark = ImageIO.read(new File(waterMarkFile));
       int waterMarkWidth = waterMark.getWidth(null);
       int waterMarkHeight = waterMark.getHeight(null);

       // 如果图片尺寸过小,则不打水印,直接返回
       if (imageWidth < waterMarkWidth + 2 * paddingRight
               || imageHeight < waterMarkHeight + 2 *paddingBottom) {
           return imageData;
       }
       BufferedImage bufferedImage = newBufferedImage(imageWidth,
               imageHeight, BufferedImage.TYPE_INT_RGB);
       Graphics g = bufferedImage.createGraphics();
       // 绘制原始图像
       g.drawImage(image, 0, 0, imageWidth, imageHeight, null);
       // 绘制水印图片
       g.drawImage(waterMark, imageWidth - waterMarkWidth -paddingRight,
               imageHeight - waterMarkHeight - paddingBottom, waterMarkWidth,
               waterMarkHeight, null);
       g.dispose();
       // 转成JPEG格式
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       JPEGImageEncoder encoder =JPEGCodec.createJPEGEncoder(out);
       encoder.encode(bufferedImage);
       byte[] data = out.toByteArray();
       out.close();
       return data;
   }
}
代码片段3
package util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class WaterMarkResponseWrapper extendsHttpServletResponseWrapper { 
   // 水印图片位置 
   private String waterMarkFile; 
   // 原response 
   private HttpServletResponse response; 
   // 自定义servletOutputStream,用于缓冲图像数据 
   private WaterMarkOutputStream waterMarkOutputStream; 
   public WaterMarkResponseWrapper(HttpServletResponse response,String waterMarkFile) throws IOException { 
       super(response); 
       this.response = response; 
       this.waterMarkFile = waterMarkFile; 
       this.waterMarkOutputStream = new WaterMarkOutputStream();
   } 
   // 覆盖getOutputStream(),返回自定义的waterMarkOutputStream 
   public ServletOutputStream getOutputStream() throwsIOException { 
       return waterMarkOutputStream; 
   } 
   public void flushBuffer() throws IOException { 
       waterMarkOutputStream.flush(); 
   } 
   // 将图像数据打水印,并输出到客户端浏览器 
   public void finishResponse() throws IOException { 
       // 原图片数据 
       byte[] imageData =waterMarkOutputStream.getByteArrayOutputStream().toByteArray(); 
       // 打水印后的图片数据 
       byte[] image = ImageUtil.waterMark(imageData, waterMarkFile); 
       // 将图像输出到浏览器 
       response.setContentLength(image.length); 
       response.getOutputStream().write(image); 
       waterMarkOutputStream.close(); 
   } 
   class WaterMarkOutputStream extends ServletOutputStream {
       // 缓冲图片数据
       private ByteArrayOutputStream byteArrayOutputStream;
       public WaterMarkOutputStream() throws IOException {
           byteArrayOutputStream = new ByteArrayOutputStream();
       }
       public void write(int b) throws IOException {
           byteArrayOutputStream.write(b);
       }
       public void close() throws IOException {
           byteArrayOutputStream.close();
       }
       public void flush() throws IOException {
           byteArrayOutputStream.flush();
       }
       public void write(byte[] b, int off, int len) throwsIOException {
           byteArrayOutputStream.write(b, off, len);
       }
       public void write(byte[] b) throws IOException {
           byteArrayOutputStream.write(b);
       }
       public ByteArrayOutputStream getByteArrayOutputStream() {
           return byteArrayOutputStream;
       }
   }
}
关于我们
翱翔简介
青鸟简介
诚聘精英
在线咨询
热门课程
BCSP软件开发专业
云计算专业
大数据专业
Web前端专业
java开发专业
翱翔就业
就业案例
翱翔荣誉
微信 公众号 在线咨询 免费课程