图片自动加水印
时间:2014-04-30 00:31:48
收藏:0
阅读:652
1 package cn.tfri.filter.watermark; 2 3 import java.io.IOException; 4 5 import javax.servlet.Filter; 6 import javax.servlet.FilterChain; 7 import javax.servlet.FilterConfig; 8 import javax.servlet.ServletException; 9 import javax.servlet.ServletRequest; 10 import javax.servlet.ServletResponse; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 14 public class WaterMarkFilter implements Filter{ 15 16 private boolean enabled; 17 private String waterMarkFile; 18 19 public boolean isEnabled() { 20 return enabled; 21 } 22 public void setEnabled(boolean enabled) { 23 this.enabled = enabled; 24 } 25 public String getWaterMarkFile() { 26 return waterMarkFile; 27 } 28 public void setWaterMarkFile(String waterMarkFile) { 29 this.waterMarkFile = waterMarkFile; 30 } 31 32 public void destroy() {} 33 34 public void doFilter(ServletRequest req, ServletResponse resp, 35 FilterChain chain) throws IOException, ServletException { 36 HttpServletRequest request = (HttpServletRequest)req; 37 HttpServletResponse response = (HttpServletResponse)resp; 38 if(this.isEnabled()){ 39 WaterMarkResponseWrapper waterMarkRes = new WaterMarkResponseWrapper(response,this.getWaterMarkFile()); 40 chain.doFilter(request, waterMarkRes); 41 waterMarkRes.finishResponse(); 42 } 43 chain.doFilter(request, response); 44 } 45 46 public void init(FilterConfig filterConfig) throws ServletException { 47 this.setEnabled("true".equalsIgnoreCase(filterConfig.getInitParameter("enabled").trim())); 48 String file = filterConfig.getInitParameter("waterMarkFile"); 49 this.setWaterMarkFile(filterConfig.getServletContext().getRealPath(file)); 50 } 51 52 }
1 package cn.tfri.filter.watermark; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletOutputStream; 6 import javax.servlet.http.HttpServletResponse; 7 import javax.servlet.http.HttpServletResponseWrapper; 8 9 import cn.tfri.hibernate.utils.ImageUtil; 10 11 public class WaterMarkResponseWrapper extends HttpServletResponseWrapper{ 12 private String waterMarkFile; 13 private HttpServletResponse response; 14 private WaterMarkOutputStream waterMarkOutputStream = new WaterMarkOutputStream(); 15 16 public String getWaterMarkFile() { 17 return waterMarkFile; 18 } 19 public void setWaterMarkFile(String waterMarkFile) { 20 this.waterMarkFile = waterMarkFile; 21 } 22 public HttpServletResponse getResponse() { 23 return response; 24 } 25 public void setResponse(HttpServletResponse response) { 26 this.response = response; 27 } 28 public WaterMarkOutputStream getWaterMarkOutputStream() { 29 return waterMarkOutputStream; 30 } 31 public void setWaterMarkOutputStream(WaterMarkOutputStream waterMarkOutputStream) { 32 this.waterMarkOutputStream = waterMarkOutputStream; 33 } 34 35 public WaterMarkResponseWrapper(HttpServletResponse response,String waterMarkFile){ 36 super(response); 37 this.setResponse(response); 38 this.setWaterMarkFile(waterMarkFile); 39 } 40 41 public ServletOutputStream getOutputStream(){ 42 return this.getWaterMarkOutputStream(); 43 } 44 @Override 45 public void flushBuffer() throws IOException { 46 this.getWaterMarkOutputStream().flush(); 47 } 48 49 public void finishResponse() throws IOException{ 50 byte[] imageData = this.getWaterMarkOutputStream().getByteArrayOutputStream().toByteArray(); 51 byte[] image = ImageUtil.waterMark(imageData, this.getWaterMarkFile()); 52 response.setContentLength(image.length); 53 response.getOutputStream().write(image); 54 this.getWaterMarkOutputStream().close(); 55 } 56 }
1 package cn.tfri.filter.watermark; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 6 import javax.servlet.ServletOutputStream; 7 8 public class WaterMarkOutputStream extends ServletOutputStream{ 9 private ByteArrayOutputStream byteArrayOutputStream; 10 11 public ByteArrayOutputStream getByteArrayOutputStream() { 12 return byteArrayOutputStream; 13 } 14 public void setByteArrayOutputStream(ByteArrayOutputStream byteArrayOutputStream) { 15 this.byteArrayOutputStream = byteArrayOutputStream; 16 } 17 18 public WaterMarkOutputStream(){ 19 this.setByteArrayOutputStream(new ByteArrayOutputStream()); 20 } 21 22 @Override 23 public void write(int b) throws IOException { 24 this.getByteArrayOutputStream().write(b); 25 } 26 @Override 27 public void close() throws IOException { 28 this.getByteArrayOutputStream().close(); 29 } 30 @Override 31 public void flush() throws IOException { 32 this.getByteArrayOutputStream().flush(); 33 } 34 @Override 35 public void write(byte[] b, int off, int len) throws IOException { 36 this.getByteArrayOutputStream().write(b, off, len); 37 } 38 @Override 39 public void write(byte[] b) throws IOException { 40 this.getByteArrayOutputStream().write(b); 41 } 42 }
1 package cn.tfri.hibernate.utils; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.Image; 7 import java.awt.image.BufferedImage; 8 import java.io.ByteArrayOutputStream; 9 import java.io.File; 10 import java.io.IOException; 11 12 import javax.imageio.ImageIO; 13 import javax.swing.ImageIcon; 14 15 import com.sun.image.codec.jpeg.JPEGCodec; 16 import com.sun.image.codec.jpeg.JPEGImageEncoder; 17 18 public class ImageUtil { 19 public static byte[] waterMark(byte[] imageData,String waterMarkFiler) throws IOException{ 20 int paddingRight = 10; 21 int paddingBottom = 10; 22 23 Image image = new ImageIcon(imageData).getImage(); 24 int imageWidth = image.getWidth(null); 25 int imageHeight = image.getHeight(null); 26 27 Image waterMark = ImageIO.read(new File(waterMarkFiler)); 28 int waterMarkWidth = waterMark.getWidth(null); 29 int waterMarkHeight = waterMark.getHeight(null); 30 31 if(imageWidth < waterMarkWidth + 2*paddingRight || imageHeight < waterMarkHeight + 2*paddingBottom){ 32 return imageData; 33 } 34 35 BufferedImage bufferedImage = new BufferedImage(imageWidth,imageHeight,BufferedImage.TYPE_INT_RGB); 36 Graphics g = bufferedImage.createGraphics(); 37 g.drawImage(image, 0, 0, imageWidth, imageHeight, null); 38 g.drawImage(waterMark,imageWidth - waterMarkWidth - paddingRight,imageHeight - waterMarkHeight - paddingBottom,waterMarkWidth,waterMarkHeight,null); 39 //设置图形上下文的当前颜色为红色 40 g.setColor(Color.red); 41 //创建新的字体 42 Font font = new Font("华文行楷",Font.BOLD,12); 43 //设置图形上下文的字体为指定字体 44 g.setFont(font); 45 //在图片上绘制文字,文字的颜色为图形上下文的当前颜色,即红色 46 g.drawString("上海烛龙-古剑奇谭", imageWidth - 200, imageHeight - 200); 47 g.dispose(); 48 49 ByteArrayOutputStream out = new ByteArrayOutputStream(); 50 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); 51 encoder.encode(bufferedImage); 52 53 byte[] data = out.toByteArray(); 54 out.close(); 55 return data; 56 } 57 }
评论(0)