虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Java编程 > Java 给图片和动图添加水印的方法

Java 给图片和动图添加水印的方法
类别:Java编程   作者:码皇   来源:互联网   点击:

本篇文章主要介绍了Java 给图片和动图添加水印的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

这两天根据需求在做图片上传添加水印,实话说重来不知道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"));
    }
    }

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

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

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

您可能感兴趣的文章:

  • Java实现给图片添加图片水印,文字水印及马赛克的方法示例
  • JAVA图片水印开发案例详解
  • 利用java批量给pdf加水印的方法示例
  • java实现倾斜水印铺满整张图
  • java实现图片上加文字水印(SpringMVC + Jsp)
  • java图片添加水印实例代码分享
  • 如何使用JAVA实现数字水印
  • 简单的java图片处理类(图片水印 图片缩放)
  • java.imageIo给图片添加水印的实现代码
  • java 图片加水印实例代码
相关热词搜索: Java 图片添加水印 Java 动图添加水印 Jav