java给图片添加水印



package utils;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.imageio.ImageIO;




public class ImageMarkLogoUtil {
 // 水印透明度
 private static float alpha = 0.95f;
 // 水印横向位置
 private static int positionWidth = 82;
 // 水印纵向位置
 private static int positionHeight = 545;
 

 public static void main(String[] args) {
  //底层图片
  String srcImgPath = "H:/123.jpg";
  //保存位置
  String targerTextPath = "h:/qie_texst.jpg";
        //设置文字坐标key与 testValue()的key对应
  Map<String, String[]> position = new HashMap<String, String[]>();
  //                 x     y    
  String sstr[] = { "100", "50" };
  position.put("name", sstr);
  String sstr2[] = { "225", "50" };
  position.put("two", sstr2);
  String sstr3[] = { "225", "100" };
  position.put("three", sstr3);
  String sstr4[] = { "225", "150" };
  position.put("four", sstr4);
  String sstr5[] = { "515", "150" };
  position.put("five", sstr5);
  String sstr6[] = { "225", "200" };
  position.put("sixe", sstr6);
  String sstr7[] = { "515", "200" };
  position.put("seven", sstr7);
  
       
  Map<String, String> value = new HashMap<String, String>();
  value.put("name", "姓名: 测试");
  value.put("two", "内科-->内分泌科  诉求:测试测试");
  value.put("three", "提交资料日期:2016年10月1日  反馈日期 :2016年10月2日");
  value.put("four", "国内医院:新华医院");
  value.put("five", "医生:XXX   手机:186xxxxxxxx");
  value.put("sixe", "国外医院:约翰霍普金斯");
  value.put("seven", "医生:XXX");
  String s = "这种情况可以诊断为结节性甲状腺肿,但这是早期表现,至少可以说不是甲状腺癌。你可以去查一下FT3 FT4TSH,看看甲状腺功能如何。治疗:1.吃左旋甲状腺素片,50ug(即一片)一天一次。2.定期检查甲状腺,包括甲状腺B超,FT3 FT4 TSH。3.多吃点海带等海货,以增加体内的碘含量。不用担心,这不是大毛病,祝您早日康复。";
  System.out.println(s.trim().length());
  System.out.println(s.length());
  int index = s.trim().length()/51;
  if(s.length()%51!=0){
     index +=1;
  }
         for(int i=0;i<index;i++){
         if(i==index-1){
          value.put("nigth"+i, s.trim().substring(0+(51*i), s.length() ));
         }else{          
          value.put("nigth"+i, s.trim().substring(0+(51*i), 51+(51*i) ));
         }
         int n = 250+(i*28) ;
       String str[] = { "100", ""+n };
       position.put("nigth"+i, str);
         }
  
         
  
  ImageMarkLogoUtil.markImageByTexts(value, position, srcImgPath, targerTextPath);
 }

 

 /**
  * 给图片添加水印文字、可设置水印文字的旋转角度
  * 
  * @param logoText
  * @param srcImgPath
  * @param targerPath
  * @param degree
  */
 public static void markImageByTexts(Map<String, String> value, Map<String, String[]> position, String srcImgPath,
   String targerPath) {

  InputStream is = null;
  OutputStream os = null;
 
  
  try {
   // 1、源图片
   Image srcImg = ImageIO.read(new File(srcImgPath));
   BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null),
     BufferedImage.TYPE_INT_RGB);
   
   
   // 2、得到画笔对象

   Iterator<String> positionIter = position.keySet().iterator();
   String key = "";
   String logotext = "";
   String[] xy;

   
   Graphics2D g = buffImg.createGraphics();
   g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
     null);
   g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
   
   // 水印文字字体
      Font font = new Font("宋体", Font.PLAIN, 19);
   // 水印文字颜色
      Color color = null;
   
      while (positionIter.hasNext()) {
    key = positionIter.next();
    xy = position.get(key);
    logotext = value.get(key);
    if(key.lastIndexOf("nigth")==-1){
     color = Color.blue;
    }else{
     color = new Color(128, 0, 128);
    }
    System.out.println("key:" + key + ",value:" + logotext);
    if (xy != null && xy.length == 2)

     // 5、设置水印文字颜色
     g.setColor(color);

        // 6、设置水印文字Font
        g.setFont(font);

        // 7、设置水印文字透明度
     g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
     
     // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
     g.drawString(logotext, Integer.valueOf(xy[0]), Integer.valueOf(xy[1]));
   }
   // 9、释放资源
      g.dispose();
   // 10、生成图片
   os = new FileOutputStream(targerPath);
   ImageIO.write(buffImg, "JPG", os);

   System.out.println("图片完成添加水印文字");

  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   try {
    if (null != is)
     is.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
   try {
    if (null != os)
     os.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }




}

原文地址    我把他的问题给修复了,把新代码贴上









  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值