JAVA实现图片加水印及Base64图片字符串加水印

可将根据不同需求选择场景一,场景二来实现家水印操作,个人感觉比我上一遍文章<base64字符串加水印 >实在

场景一:

涉及上送过来的不直接是图片,而是Base64字符串,则先需转换读取,然后再打上水印,最后再合成一张返回Base64

package transtion; 

   

 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.ByteArrayOutputStream; 

 import java.io.FileInputStream; 

 import java.io.FileOutputStream; 

 import java.io.IOException; 

 import java.io.InputStream; 

 import java.io.OutputStream; 



 import javax.imageio.ImageIO; 

 import javax.swing.ImageIcon; 



 import sun.misc.BASE64Decoder; 

 import sun.misc.BASE64Encoder; 



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

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



   

 /******************************************************************************* 

  * Description: 图片水印工具类  

  * Copyright: Copyright (c) 2011  

  * Company: Founder  

  * Project: CMS 

  *  

  * @Author taoxg 

  * @version 1.0 

  * @See  

  * HISTORY 2011-9-27 taoxg create 

  ******************************************************************************/ 

 public class waterBase64 { 

       

     // 水印透明度  

     private static float alpha = 0.9f; 

     // 水印横向位置 

     private static int positionWidth = 150; 

     // 水印纵向位置 

     private static int positionHeight = 100; 

     // 水印文字字体 

     private static Font font = new Font("宋体", Font.BOLD, 30); 

     // 水印文字颜色 

     private static Color color = Color.red; 

     /** 

      *  

      * @param alpha  

      *          水印透明度 

      * @param positionWidth  

      *          水印横向位置 

      * @param positionHeight  

      *          水印纵向位置 

      * @param font  

      *          水印文字字体 

      * @param color  

      *          水印文字颜色 

      */ 

     public static void setImageMarkOptions(float alpha , int positionWidth , int positionHeight ,Font font,Color color){ 

         if(alpha!=0.0f)waterBase64.alpha = alpha; 

         if(positionWidth!=0)waterBase64.positionWidth = positionWidth; 

         if(positionHeight!=0)waterBase64.positionHeight = positionHeight; 

         if(font!=null)waterBase64.font = font; 

         if(color!=null)waterBase64.color = color; 

     } 

       

     public static void main(String [] args){ 

      
String srcImgPath = "666.png";   

      
String iconPath = "water_logo.png";   

      
String targerIconPath2 = "hecheng.jpg"; 

      
String logoText = "我爱北京天安门";  

      

      
//可通过此方法调试间距,颜色.不适用则默认初始化数据 

      
setImageMarkOptions(0.9f,250,100,null,null); 

          

         /**给图片添加水印图片,水印图片旋转-45*/ 

         markImageByIcon(iconPath, srcImgPath, targerIconPath2, 0);  

   

     } 

   

     //读取图片转为Base64字符串 

     public static String TuImage(String args) {   

          

         String imgFile = args;//待处理的图片      

         InputStream in = null;      

         byte[] data = null;      

         //读取图片字节数组      

         try{      

             in = new FileInputStream(imgFile);              

             data = new byte[in.available()];      

             in.read(data);      

             in.close();      

         }catch (IOException e){      

             e.printStackTrace();      

         }      

         //对字节数组Base64编码      

         BASE64Encoder encoder = new BASE64Encoder();      

         return encoder.encode(data); 

     } 

      

     /** 

      * 给图片添加水印图片、可设置水印图片旋转角度 

      *  

      * @param iconPath 

      *            水印图片路径 

      * @param srcImgPath 

      *            源图片路径 

      * @param targerPath 

      *            目标图片路径 

      * @param degree 

      *            水印图片旋转角度 

      */ 

     public static String markImageByIcon(String iconPath, String srcImgPath,String targerPath, Integer degree) { 

         

      
BASE64Encoder base64en = new BASE64Encoder(); 

      
BASE64Decoder base64de = new BASE64Decoder(); 

      
InputStream is = null; 

      
OutputStream os = null; 

      
byte [] b; 

         try { 

          
//针对上送的图片是Base64场景 

             b= base64de.decodeBuffer(TuImage(srcImgPath)); 

             is=new java .io.ByteArrayInputStream(b); 

             BufferedImage srcImg = ImageIO.read(is); 



             BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB); 

   

             // 1、得到画笔对象 

             Graphics2D g = buffImg.createGraphics(); 

   

             // 2、设置对线段的锯齿状边缘处理 

             g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); 

             g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null); 

             // 3、设置水印旋转 

             if (null != degree) { 

                 g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2); 

             } 

   

             // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度(本地地址可直接填写,服务器地址ImageIcon导包位置一定要正确) 

             ImageIcon imgIcon = new ImageIcon(iconPath); 

   

             // 5、得到Image对象。 

             Image img = imgIcon.getImage(); 

               

             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha)); 

   

             // 6、水印图片的位置 

             g.drawImage(img, positionWidth, positionHeight, null); 

             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER)); 

             // 7、释放资源 

             g.dispose(); 

               

             // 8、生成图片 

 //            os = new FileOutputStream(targerPath); 

 //            ImageIO.write(buffImg, "JPG", os); 

              

             //把图片转换为字节 

             ByteArrayOutputStream bot = new ByteArrayOutputStream(); 

             JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bot); 

             encoder.encode(buffImg); 

             byte [] rstByte = bot.toByteArray(); 

             srcImgPath = base64en.encode(rstByte);            

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

             return srcImgPath; 

              

         } catch (Exception e) { 

             e.printStackTrace(); 

         } finally { 

             try { 

                 if (null != os) 

                     os.close(); 

                 if(null != is) 

                  
is.close(); 

             } catch (Exception e) { 

                 e.printStackTrace(); 

             } 

         } 

 return targerPath; 

     } 

 }


场景二:

直接将图片加水印图片,加水印文字


package transtion;
  
 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 javax.imageio.ImageIO;
 import javax.swing.ImageIcon;
  
 /*******************************************************************************
  * Description: 图片水印工具类 
  * Copyright: Copyright (c) 2011 
  * Company: Founder 
  * Project: CMS
  * 
  * @Author taoxg
  * @version 1.0
  * @See 
  * HISTORY 2011-9-27 taoxg create
  ******************************************************************************/
 public class ImageMarkLogoUtil {
      
     // 水印透明度 
     private static float alpha = 0.9f;
     // 水印横向位置
     private static int positionWidth = 150;
     // 水印纵向位置
     private static int positionHeight = 100;
     // 水印文字字体
     private static Font font = new Font("宋体", Font.BOLD, 30);
     // 水印文字颜色
     private static Color color = Color.red;
     /**
      * 
      * @param alpha 
      *          水印透明度
      * @param positionWidth 
      *          水印横向位置
      * @param positionHeight 
      *          水印纵向位置
      * @param font 
      *          水印文字字体
      * @param color 
      *          水印文字颜色
      */
     public static void setImageMarkOptions(float alpha , int positionWidth , int positionHeight ,Font font,Color color){
         if(alpha!=0.0f)ImageMarkLogoUtil.alpha = alpha;
         if(positionWidth!=0)ImageMarkLogoUtil.positionWidth = positionWidth;
         if(positionHeight!=0)ImageMarkLogoUtil.positionHeight = positionHeight;
         if(font!=null)ImageMarkLogoUtil.font = font;
         if(color!=null)ImageMarkLogoUtil.color = color;
     }
      
     /**
      * 给图片添加水印图片
      * 
      * @param iconPath
      *            水印图片路径
      * @param srcImgPath
      *            源图片路径
      * @param targerPath
      *            目标图片路径
      */
     public static void markImageByIcon(String iconPath, String srcImgPath,
             String targerPath) {
         markImageByIcon(iconPath, srcImgPath, targerPath, null);
     }
  
     /**
      * 给图片添加水印图片、可设置水印图片旋转角度
      * 
      * @param iconPath
      *            水印图片路径
      * @param srcImgPath
      *            源图片路径
      * @param targerPath
      *            目标图片路径
      * @param degree
      *            水印图片旋转角度
      */
     public static void markImageByIcon(String iconPath, String srcImgPath,
             String targerPath, Integer degree) {
         OutputStream os = null;
         try {
              
             Image srcImg = ImageIO.read(new File(srcImgPath));
  
             BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                     srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
  
             // 1、得到画笔对象
             Graphics2D g = buffImg.createGraphics();
  
             // 2、设置对线段的锯齿状边缘处理
             g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
             g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
             // 3、设置水印旋转
             if (null != degree) {
                 g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
             }
  
             // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度(本地地址可直接填写,服务器地址ImageIcon导包位置一定要正确)
             ImageIcon imgIcon = new ImageIcon(iconPath);
  
             // 5、得到Image对象。
             Image img = imgIcon.getImage();
              
             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,alpha));
  
             // 6、水印图片的位置
             g.drawImage(img, positionWidth, positionHeight, null);
             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
             // 7、释放资源
             g.dispose();
              
             // 8、生成图片
             os = new FileOutputStream(targerPath);
             ImageIO.write(buffImg, "JPG", os);
  
             System.out.println("图片完成添加水印图片");
              
         } catch (Exception e) {
             e.printStackTrace();
         } finally {
             try {
                 if (null != os)
                     os.close();
             } catch (Exception e) {
                 e.printStackTrace();
             }
         }
     }
  
     /**
      * 给图片添加水印文字
      * 
      * @param logoText 
      *          水印文字
      * @param srcImgPath
      *          源图片路径
      * @param targerPath
      *          目标图片路径
      */
     public static void markImageByText(String logoText, String srcImgPath,
             String targerPath) {
         markImageByText(logoText, srcImgPath, targerPath, null);
     }
  
     /**
      * 给图片添加水印文字、可设置水印文字的旋转角度
      * 
      * @param logoText
      * @param srcImgPath
      * @param targerPath
      * @param degree
      */
     public static void markImageByText(String logoText, String srcImgPath,
             String targerPath, Integer degree) {
          
         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、得到画笔对象
             Graphics2D g = buffImg.createGraphics();
             // 3、设置对线段的锯齿状边缘处理
             g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR);
             g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
             // 4、设置水印旋转
             if (null != degree) {
                 g.rotate(Math.toRadians(degree),(double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 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, positionWidth, positionHeight);
             // 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();
             }
         }
     }
      
     public static void main(String [] args){
     String srcImgPath = "666.png";  
     String iconPath = "water_logo.png";  
     String targerIconPath2 = "hecheng.jpg";
     String logoText = "我爱北京天安门"; 
     
     //可通过此方法调试间距,颜色.不适用则默认初始化数据
     setImageMarkOptions(0.9f,250,100,null,null);
         
         /**给图片添加水印图片,水印图片旋转-45*/
 //        markImageByIcon(iconPath, srcImgPath, targerIconPath2, 0); 
         /**给图片添加水印图片,水印图片旋转-45  平行*/ 
 //        markImageByIcon(iconPath, srcImgPath, targerIconPath2,45);  
         /**给图片添加水印文字,水印图片旋转  平行*/ 
 //        markImageByText(logoText, srcImgPath, targerIconPath2);  
         /**给图片添加水印文字,水印图片旋转-45*/ 
         markImageByText(logoText, srcImgPath, targerIconPath2, -45);  
     }
 }