java 给图片加文字水印

java给图片加水印,在网上有很多资料,但我想要一个能自适应图片大小,将水印加在图片中间或右下角,这个问题我觉得应该是一个算法的问题
得根据图片大小调整水印文字的字体大小,及显示缩进比例
package com.jc.ts.services;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 *添加图片水印的服务类
 * */
public class WaterMark {
  /**
   * @param sizeContext添加水印文字
   * @param request 请求流对象
   * @param request 响应流对象
   * */
   @SuppressWarnings("deprecation")
 public   static   void  createMarkSize(String sizeContext,HttpServletRequest request,HttpServletResponse response)   {
    try {
     String path=request.getRealPath(request.getServletPath());
     FileInputStream in=new FileInputStream(path);
     Image src=ImageIO.read(in);
     int w=src.getWidth(null);
     int h=src.getHeight(null);
     BufferedImage img=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);//构建画板
     Graphics g=img.getGraphics();//得到画笔
     g.drawImage(src,0,0,w,h,null);//把源图片写入画板
     g.setColor(Color.red);
     g.drawString(sizeContext,10,5);  // 添加文字
     g.dispose();//生成图片
     JPEGImageEncoder e=JPEGCodec.createJPEGEncoder(response.getOutputStream());
     e.encode(img);
     response.getOutputStream().close();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (ImageFormatException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
  /** 
    * @param localPath 添加水印LOGO路径
    * @param request 请求流对象
    * @param request 响应流对象
    **/
    @SuppressWarnings("deprecation")
  public   static   void  createMarkLogo(String localPath,HttpServletRequest request,HttpServletResponse response)   {
     try {
      FileInputStream file=new FileInputStream(localPath);
      Image fimg=ImageIO.read(file);
      int fw=fimg.getWidth(null);
      int fh=fimg.getHeight(null);
      String path=request.getRealPath(request.getServletPath());
      FileInputStream in=new FileInputStream(path);
      Image src=ImageIO.read(in);
      int w=src.getWidth(null);
      int h=src.getHeight(null);
      BufferedImage img=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);//构建画板
      Graphics g=img.getGraphics();//得到画笔
      g.drawImage(src,0,0,w,h,null);//把原图片写入画板
      g.drawImage(fimg,w-20,h-15,fw,fh,null);//把水印图片写入画板
      g.dispose();//生成图片
      JPEGImageEncoder e=JPEGCodec.createJPEGEncoder(response.getOutputStream());
      e.encode(img);
      response.getOutputStream().close();
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ImageFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

}

      /** 
    * @param localPath 添加水印图片路径
    * @param request 请求流对象
    * @param request 响应流对象
                  * @param width   水印图片的宽度
                  * @param height  水印图片的长度
    **/
    @SuppressWarnings("deprecation")
  public   static   void  createMarkLogo(String localPath,HttpServletRequest request,HttpServletResponse response,int width,int height)   {
     try {
      FileInputStream file=new FileInputStream(localPath);
      Image fimg=ImageIO.read(file);
      int fw=fimg.getWidth(null);
      int fh=fimg.getHeight(null);
      String path=request.getRealPath(request.getServletPath());
      FileInputStream in=new FileInputStream(path);
      Image src=ImageIO.read(in);
      int w=src.getWidth(null);//w为你过滤图片的宽度
      int h=src.getHeight(null);//h为你过滤图片的长度
      BufferedImage img=new BufferedImage(w+width,h+height,BufferedImage.TYPE_INT_RGB);//构建画板(画板的宽度为两个图片之和)
      Graphics g=img.getGraphics();//得到画笔
      g.drawImage(src,0,0,w,h,null);//把原图片写入画板
      g.drawImage(fimg,width,height,fw,fh,null);//把水印图片写入画板
      g.dispose();//生成图片
      JPEGImageEncoder e=JPEGCodec.createJPEGEncoder(response.getOutputStream());
      e.encode(img);
      response.getOutputStream().close();
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ImageFormatException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }

}   
注意第三个方法的注释地方g.drawImage(fimg,width,height,fw,fh,null);根据参数你在调调(放原图下面的)

过滤器调用
package com.jc.ts.filter;

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.jc.ts.services.WaterMark;

public class WaterFilter implements Filter {

 public void destroy() {
  // TODO Auto-generated method stub

 }
 public void doFilter(ServletRequest arg0, ServletResponse arg1,
   FilterChain arg2) throws IOException, ServletException {
    HttpServletRequest request=(HttpServletRequest)arg0;
    HttpServletResponse response=(HttpServletResponse)arg1;
    //WaterMark.createMarkSize("南京ts", request, response);
                 //WaterMark.createMarkLogo("D:\\workspace\\mybook\\WebRoot\\images\\logo\\book.jpg", request, response);
    WaterMark.createMarkLogo("D:\\workspace\\mybook\\WebRoot\\images\\logo\\book.jpg", request, response,20,30);
                   //注意路径为绝对路径且三个效果不能同时执行
   
 }

 public void init(FilterConfig arg0) throws ServletException {
  // TODO Auto-generated method stub

 }

}

 web.xml配置(写在servlet上面)

<filter>
  <description>This is the description of my J2EE component</description> 
  <display-name>This is the display name of my J2EE component</display-name> 
  <filter-name>WaterFilter</filter-name> 
  <filter-class>com.jc.ts.filter.WaterFilter</filter-class> 
  </filter>
希望你能满意。。。。。。
Java可以使用Java2D API来实现图片文字水印。下面是一个简单的示例代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class ImageWatermark { public static void main(String[] args) throws IOException { // 读取原始图片 BufferedImage image = ImageIO.read(new File("original.jpg")); // 创建一个空白的图片,大小和原始图片一样 BufferedImage result = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB); // 获取图片的Graphics2D对象 Graphics2D g = result.createGraphics(); // 将原始图片绘制到空白图片上 g.drawImage(image, 0, 0, null); // 设置水印文字的相关属性 String text = "Hello, world!"; Font font = new Font("Arial", Font.BOLD, 36); Color color = Color.WHITE; // 绘制水印文字 g.setFont(font); g.setColor(color); int x = (image.getWidth() - g.getFontMetrics().stringWidth(text)) / 2; int y = image.getHeight() / 2; g.drawString(text, x, y); // 保存水印图片 ImageIO.write(result, "jpg", new File("watermark.jpg")); } } ``` 在这个示例代码中,我们首先读取原始图片,然后创建一个空白的图片,大小和原始图片一样。接着,我们获取空白图片的Graphics2D对象,将原始图片绘制到空白图片上。然后,我们设置水印文字的相关属性,包括文字内容、字体和颜色,并在空白图片上绘制水印文字。最后,我们将水印图片保存到文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值