servlet上传图片文件添加水印实例



servlet上传图片文件拦截器添加水印源码实例,如何为图片添加水印?拦截器添加水印的方法,设置水印的位置大小宽度,使用缓冲区向浏览器输出水印的方法:

Filter_Woter.java水印拦截器:

package com.cn.filter;

import java.io.File;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cn.control.Response_WoterMark;

public class Filter_Woter 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 {

HttpServletRequest request = (HttpServletRequest) req; // request对象
HttpServletResponse response = (HttpServletResponse) res; // response对象
// 自定义response
Response_WoterMark waterMarkRes =new Response_WoterMark(response, waterMarkFile);

chain.doFilter(request, response); // doFilter

waterMarkRes.finishResponse(); // 打水印,输出到客户端浏览器
}
public void destroy() {}

}

 ImageUtil.java水印设置文件源码:

package com.cn.control;
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; // 水印图片的右边距设置为10
int paddingBottom = 10; // 水印图片的下边距设置为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 = new BufferedImage(imageWidth, // 图像缓冲区
imageHeight, BufferedImage.TYPE_INT_RGB);

Graphics g = bufferedImage.createGraphics(); // 绘图用的Graphic对象

g.drawImage(image, 0, 0, imageWidth, imageHeight, null); // 绘制原始图像
g.drawImage(waterMark, imageWidth – waterMarkWidth – paddingRight, // 绘制水印图片
imageHeight – waterMarkHeight – paddingBottom, waterMarkWidth,
waterMarkHeight, null);
g.dispose();

ByteArrayOutputStream out = new ByteArrayOutputStream(); // 输出流,缓存数据
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); // 转成JPG图
encoder.encode(bufferedImage); // 转换
byte[] data = out.toByteArray(); // 输出二进制
out.close();
return data;
}
}

Response_WoterMark.java文件源码:


package com.cn.control;

import java.io.File;
import java.io.IOException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
public class Response_WoterMark extends HttpServletResponseWrapper {

private String waterMarkFile; // 水印图片位置
private HttpServletResponse response; // 原response

// 自定义servletOutputStream,用于缓冲图像数据
private WaterMark_Output waterMarkOutputStream = new WaterMark_Output();

public Response_WoterMark(HttpServletResponse response,
String waterMarkFile) throws IOException {
super(response);
this.response = response;
this.waterMarkFile = waterMarkFile;
}

// 覆盖getOutputStream(),返回自定义的waterMarkOutputStream
public ServletOutputStream getOutputStream() throws IOException {
return waterMarkOutputStream; // 返回自定义的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(); // 关闭waterMarkOutputStream流
}
}

 WaterMark_Output.java源码:

package com.cn.control;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.servlet.ServletOutputStream;

public class WaterMark_Output extends ServletOutputStream{
private ByteArrayOutputStream byteArrayOutputStream; // 缓冲图片数据

public WaterMark_Output() 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) throws IOException { // 覆盖父类方法
byteArrayOutputStream.write(b, off, len);
}
public void write(byte[] b) throws IOException { // 覆盖父类方法
byteArrayOutputStream.write(b);
}
public ByteArrayOutputStream getByteArrayOutputStream() { // getter方法
return byteArrayOutputStream;
}

}

web.xml文件:

<?xml version=”1.0″ encoding=”UTF-8″?>
<web-app version=”2.5″
xmlns=”http://java.sun.com/xml/ns/javaee”
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”>
<filter>
<filter-name>waterMarkFilter</filter-name>
<filter-class>
com.cn.filter.Filter_Woter
</filter-class>

</filter>
<filter-mapping>
<filter-name>waterMarkFilter</filter-name>
<url-pattern>*.jpg</url-pattern>
</filter-mapping>

</web-app>