首页 > 开发 > Java > 正文

Java 给图片和动图添加水印的方法

2024-07-14 08:40:16
字体:
来源:转载
供稿:网友

这两天根据需求在做图片上传添加水印,实话说重来不知道java还可以这样操作,既然有个这要求我就去找资料研究了一番,现在把它分享一下,希望能帮到有需要的兄弟。

给普通图片添加水印和给动图添加水印是不一样的,给普通图片添加水印用的是java自带的方法写的,给动图使用了gif4j框架,这个框架在CSDN里面很多可以下载,建议下载破解版的,因为原来的jar包会有自带的一个水印是去不了的。

import java.awt.*; import java.awt.image.BufferedImage; import java.io.*;  import javax.imageio.ImageIO; import javax.swing.ImageIcon;   //这下面是 gif4j 框架的类 import com.gif4j.GifDecoder; import com.gif4j.GifEncoder; import com.gif4j.GifImage; import com.gif4j.GifTransformer; import com.gif4j.TextPainter; import com.gif4j.Watermark;   /**  * Created by ZXD on 2018/1/18.  */ public class ImageRemarkUtil {   // 水印透明度   private float alpha = 0.5f;   // 水印横向位置   private int positionWidth = 150;   // 水印纵向位置   private int positionHeight = 300;   //水印宽   private int width = 80;   //水印高   private int height = 80;   // 水印文字字体   private Font font = new Font("宋体", Font.BOLD, 72);   // 水印文字颜色   private Color color = Color.red;       /***********普通图片加水印***********/     /**    *    * @param alpha    *      水印透明度    * @param positionWidth    *      水印横向位置    * @param positionHeight    *      水印纵向位置    * @param font    *      水印文字字体    * @param color    *      水印文字颜色    */   public void setImageMarkOptions(float alpha, int positionWidth,                       int positionHeight,int width,int height, Font font, Color color) {     if (alpha != 0.0f)       this.alpha = alpha;     if (positionWidth != 0)       this.positionWidth = positionWidth;     if (positionHeight != 0)       this.positionHeight = positionHeight;     if (height != 0)       this.height = height;     if (width != 0)       this.width = width;     if (font != null)       this.font = font;     if (color != null)       this.color = color;   }     /**    * 给图片添加水印图片    *    * @param iconPath    *      水印图片路径    * @param srcImgPath    *      源图片路径    * @param targerPath    *      目标图片路径    */   public void markImageByIcon(String iconPath, String srcImgPath,                     String targerPath) {     markImageByIcon(iconPath, srcImgPath, targerPath, null);   }     /**    * 给图片添加水印图片、可设置水印图片旋转角度    *    * @param iconPath    *      水印图片路径    * @param srcImgPath    *      源图片路径    * @param targerPath    *      目标图片路径    * @param degree    *      水印图片旋转角度    */   public 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 imgIcon = new ImageIcon(iconPath);         // 5、得到Image对象。       Image img = imgIcon.getImage();         g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,           alpha));         Integer X = srcImg.getWidth(null);         Integer Y = srcImg.getHeight(null);         // 6、水印图片的位置       g.drawImage(img, X-(positionWidth+width), Y-(positionHeight+height),width,height,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 void markImageByText(String logoText, String srcImgPath,                     String targerPath) {     markImageByText(logoText, srcImgPath, targerPath, null);   }     /**    * 给图片添加水印文字、可设置水印文字的旋转角度    *    * @param logoText    * @param srcImgPath    * @param targerPath    * @param degree    */   public 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();       }     }   }      /*********** 动图加水印 ************/     /**    * 缩放gif图片,直接传的File文件,可设置宽和高    */   public void makeGif(File src, File dest, int width, int height) throws IOException {       GifImage gifImage = GifDecoder.decode(src);// 创建一个GifImage对象.       GifImage resizeIMG = GifTransformer.resize(gifImage, width, height, true);       GifEncoder.encode(resizeIMG, dest);     }    //缩放gif图片,直接传文件路径,可设置宽和高   public void makeGif(String src, String dest, int width, int height) throws IOException {     GifImage gifImage = GifDecoder.decode(new File(src));// 创建一个GifImage对象.       makeGif(new File(src), new File(dest), gifImage.getScreenWidth() / 2,         gifImage.getScreenHeight() / 2);     }    //缩放gif图片,传文件File文件,不可设置宽和高   public void makeGif(File src, File dest) throws IOException {       GifImage gifImage = GifDecoder.decode(src);// 创建一个GifImage对象.       makeGif(src, dest, gifImage.getScreenWidth() / 2, gifImage.getScreenHeight() / 2);     }    //缩放gif图片,传文件路径,不可设置宽和高   public void makeGif(String src, String dest) throws IOException {       makeGif(new File(src), new File(dest));     }     /**    * 动图中加文字水印    */   public void addTextWatermarkToGif(File src, String watermarkText, File dest)throws IOException {       //水印初始化、设置(字体、样式、大小、颜色)       TextPainter textPainter = new TextPainter(new Font("黑体", Font.ITALIC, 12));       textPainter.setOutlinePaint(Color.WHITE);       BufferedImage renderedWatermarkText = textPainter.renderString(watermarkText, true);       //图片对象     GifImage gf = GifDecoder.decode(src);       //获取图片大小       int iw = gf.getScreenWidth();       int ih = gf.getScreenHeight();       //获取水印大小       int tw = renderedWatermarkText.getWidth();       int th = renderedWatermarkText.getHeight();       //水印位置       Point p = new Point();     p.x = iw - tw - 5;     p.y = ih - th - 4;       //加水印     Watermark watermark = new Watermark(renderedWatermarkText, p);     gf = watermark.apply(GifDecoder.decode(src), true);     //输出     GifEncoder.encode(gf, dest);   }     /**    * 动图中加图片水印    */   public void addImageWatermarkToGif(File src, String watermarkPath, File dest){       try{         BufferedImage renderedWatermarkText = ImageIO.read(new File(watermarkPath));         //图片对象       GifImage gf = GifDecoder.decode(src);         //获取图片大小       int iw = gf.getScreenWidth();       int ih = gf.getScreenHeight();         //获取水印大小       int tw = renderedWatermarkText.getWidth();       int th = renderedWatermarkText.getHeight();         //水印位置       Point p = new Point();       p.x = iw-tw-20;       p.y = ih-th-20;         //加水印       Watermark watermark = new Watermark(renderedWatermarkText, p);       //水印透明度       watermark.setTransparency(1);       gf = watermark.apply(GifDecoder.decode(src), false);       //输出       GifEncoder.encode(gf, dest);     } catch (IOException e){       e.printStackTrace();     }   }      public static void main(String[] args) {     //需要加水印图片的路径     String srcImgPath = "d:/1.jpg";     String logoText = "复 印 无 效";     //图片水印的路径     String iconPath = "d:/2.jpg";        //添加完水印文件的输出路径     String targerTextPath = "d:/qie_text.jpg";     String targerTextPath2 = "d:/qie_text_rotate.jpg";     String targerIconPath = "d:/qie_icon.jpg";     String targerIconPath2 = "d:/qie_icon_rotate.jpg";       System.out.println("给图片添加水印文字开始...");     // 给图片添加水印文字     markImageByText(logoText, srcImgPath, targerTextPath);     // 给图片添加水印文字,水印文字旋转-45     markImageByText(logoText, srcImgPath, targerTextPath2, -45);     System.out.println("给图片添加水印文字结束...");       System.out.println("给图片添加水印图片开始...");     setImageMarkOptions(0.3f, 1, 1, null, null);      // 给图片添加水印图片     markImageByIcon(iconPath, srcImgPath, targerIconPath);     // 给图片添加水印图片,水印图片旋转-45     markImageByIcon(iconPath, srcImgPath, targerIconPath2, -45);     System.out.println("给图片添加水印图片结束...");       //动图添加水印(添加水印动图文件,添加的水印,添加完输出文件)     addTextWatermarkToGif(new File("d://10.gif"), "复 印 无 效", new File("d://11.gif"));     addImageWatermarkToGif(new File("d://gif//10.gif"), "d://gif//3.png", new File("d://gif//4.gif"));     }   } 

这里面有普通图片添加水印和动图添加水印,普通图片添加水印方法如果传的是动图能添加成功,但是动图就成静态的了,动图添加水印方法如果传的是普通图片,会直接报错了。

这些我在做的时候都有试过,现在就当记笔记记录在此,也希望能帮助到有需要的兄弟。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VeVb武林网。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表