教你怎么用Java实现给图片打上水印

一、原图片

二、打水印(文字)

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

public class ImageUtils {

    // 水印字体
    private static final Font FONT = new Font("微软雅黑", Font.PLAIN, 14);

    // 透明度
    private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f);

    // 水印之间的间隔
    private static final int XMOVE = 150;

    // 水印之间的间隔
    private static final int YMOVE = 200;

    /**
     * 打水印(文字)
     *
     * @param srcImgPath       源文件地址
     * @param font             字体
     * @param markContentColor 水印颜色
     * @param waterMarkContent 水印内容
     */
    public static void markWithContent(String srcImgPath, Font font, Color markContentColor, String waterMarkContent) {
        FileOutputStream fos = null;
        try {
            // 读取原图片信息
            File srcFile = new File(srcImgPath);
            BufferedImage srcImg = ImageIO.read(srcFile);

            // 图片宽、高
            int imgWidth = srcImg.getWidth();
            int imgHeight = srcImg.getHeight();

            // 图片缓存
            BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);

            // 创建绘图工具
            Graphics2D g = bufImg.createGraphics();

            // 画入原始图像
            g.drawImage(srcImg, 0, 0, imgWidth, imgHeight, null);

            // 设置水印颜色
            g.setColor(markContentColor);

            // 设置水印透明度
            g.setComposite(COMPOSITE);

            // 设置倾斜角度
            g.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);

            // 设置水印字体
            g.setFont(font);

            // 消除java.awt.Font字体的锯齿
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            int x = -imgWidth / 2;
            int y;

            // 字体长度
            int markWidth = FONT.getSize() * getTextLength(waterMarkContent);
            // 字体高度
            int markHeight = FONT.getSize();

            // 循环添加水印
            while (x < imgWidth * 1.5) {
                y = -imgHeight / 2;
                while (y < imgHeight * 1.5) {
                    g.drawString(waterMarkContent, x, y);
                    y += markHeight + YMOVE;
                }
                x += markWidth + XMOVE;
            }

            // 释放画图工具
            g.dispose();

            // 输出图片
            fos = new FileOutputStream(srcFile);
            ImageIO.write(bufImg, "jpg", fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    //计算水印文本长度
    //1、中文长度即文本长度 2、英文长度为文本长度二分之一
    public static int getTextLength(String text) {
        //水印文字长度
        int length = text.length();

        for (int i = 0; i < text.length(); i++) {
            String s = String.valueOf(text.charAt(i));
            if (s.getBytes().length > 1) {
                length++;
            }
        }
        length = length % 2 == 0 ? length / 2 : length / 2 + 1;
        return length;
    }

    public static void main(String[] args) {
        ImageUtils.markWithContent("C:\\Users\\lbb\\Pictures\\test.jpg", FONT, Color.darkGray, "水印文字");
    }
}

打了水印后的效果

三、打水印(图片)

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;

public class ImageUtils {

    // 透明度
    private static final AlphaComposite COMPOSITE = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f);

    // 水印之间的间隔
    private static final int XMOVE = 150;

    // 水印之间的间隔
    private static final int YMOVE = 200;

    /**
     * 打水印(图片)
     *
     * @param srcImgPath  源图片路径
     * @param markImgPath 水印图片路径
     */
    public static void markWithImg(String srcImgPath, String markImgPath) {
        FileOutputStream fos = null;

        try {
            // 读取原始图像
            File srcFile = new File(srcImgPath);
            BufferedImage srcImg = ImageIO.read(srcFile);

            // 原始宽度
            int srcImgWidth = srcImg.getWidth();
            // 原始高度
            int srcImgHeight = srcImg.getHeight();

            // 最终图像
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);

            // 创建绘图工具
            Graphics2D g = bufImg.createGraphics();

            // 画入原始图像
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);

            // 读取水印图片
            BufferedImage markImg = ImageIO.read(new File(markImgPath));

            // 图片宽、高
            int markImgWidth = markImg.getWidth();
            int markImgHeight = markImg.getHeight();

            // 设置水印透明度
            g.setComposite(COMPOSITE);

            // 设置倾斜角度
            g.rotate(Math.toRadians(-35), (double) bufImg.getWidth() / 2, (double) bufImg.getHeight() / 2);

            // 循环添加水印
            int x = -srcImgWidth / 2;
            int y;
            while (x < srcImgWidth * 1.5) {
                y = -srcImgHeight / 2;
                while (y < srcImgHeight * 1.5) {
                    g.drawImage(markImg, x, y, null);
                    y += markImgHeight + YMOVE;
                }
                x += markImgWidth + XMOVE;
            }

            // 释放画图工具
            g.dispose();

            // 输出图片
            fos = new FileOutputStream(srcFile);
            ImageIO.write(bufImg, "jpg", fos);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                try {
                    fos.flush();
                    fos.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        ImageUtils.markWithImg("C:\\Users\\lbb\\Pictures\\test.jpg", "C:\\Users\\lbb\\Pictures\\mark.png");
    }
}

下面是水印图片

下面是打了水印后的效果

到此这篇关于教你怎么用Java实现给图片打上水印的文章就介绍到这了,更多相关Java实现给图片打上水印内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java图片处理 (文字水印、图片水印、缩放、补白)代码实例

    package com.hmw.picMark; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; import java.awt.im

  • java实现给图片加铺满的网格式文字水印

    效果: 原图 加水印后的图片 废话不多说,直接上代码 代码: package com.example.demo; 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.BufferedIma

  • Java在Excel中添加水印的实现(单一水印、平铺水印)

    在Excel中没有直接添加水印的功能,但依旧可以通过一定方式来实现类似水印效果.本文通过Java程序代码介绍具体实现方法.可添加单一水印效果,即水印是以单个文本字样来呈现:也可添加多个平铺水印效果,即水印是以多个文本字样来页面中平铺.详细内容见下文. 程序环境: 测试文档:Office Excel 2013 编译环境:IntelliJ IDEA 2018 JDK版本:1.8.0 Excel库:Java系列free spire.xls.jar 3.9.1 1.单一水印效果 import com.s

  • Java实现给图片添加图片水印,文字水印及马赛克的方法示例

    本文实例讲述了Java实现给图片添加图片水印,文字水印及马赛克的方法.分享给大家供大家参考,具体如下: 可以在eclipse中新建个Utils类,把以下代码复制进去直接使用,以下方法实现单个或多个水印的添加 package com.rzxt.fyx.common.util; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import

  • Java在Word中添加多行图片水印

    Word中设置水印效果时,不论是文本水印或者是图片水印都只能添加单个文字或者图片到Word页面,效果比较单一,本文通过Java代码示例介绍如何在页面中添加多行图片水印效果,即水印效果以多个图片平铺到页面.(添加多行文字水印效果,可以查看这篇文章中的方法) 程序环境:使用spire.doc.jar,版本:3.9.0 Java代码: import com.spire.doc.*; import com.spire.doc.documents.Paragraph; import com.spire.d

  • Java如何给Word文档添加多行文字水印

    前言 我在以往的文章中曾介绍过如何给Word文档添加文本水印和图片水印,及怎样删除文档中的水印.关于文本水印,之前那篇教程里主要指的是单行字体的水印,而在操作Word文档时,有时也会碰到需要添加多行文字水印的情况.所以,本文将演示如何使用Java程序来为Word文档添加多行文字水印. 代码测试环境: Intellij Idea2019.1 JDK 1.8.0 Spire.Doc.jar Jar包获取及导入 方法一:手动将Jar包导入IDEA.具体步骤如下: 步骤 1:在 E-iceblue中文官

  • Java添加Word文本水印和图片水印

    水印是一种常用于各种文档的声明.防伪手段,一般可设置文字水印或者加载图片作为水印.以下内容将分享通过Java编程给Word文档添加水印效果的方法,即 文本水印 图片水印 使用工具:Free Spire.Doc for Java (免费版) Jar导入 方法1:通过官网下载控件包.在程序下新建一个directory目录,并命名(本示例中命名为lib):将控件包lib文件夹下的jar(如下图1)复制到程序中新建的目录下. 图1: 复制jar文件后,鼠标右键点击jar文件,选择"Add as Libr

  • 教你怎么用Java实现给图片打上水印

    一.原图片 二.打水印(文字) import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; public class ImageUtils { // 水印字体 private static final Font FONT = new Font("微软雅黑", Font.

  • jquery.Jcrop结合JAVA后台实现图片裁剪上传实例

    本文介绍了头像裁剪上传功能,用到的技术有  jQuery,springmvc,裁剪插件用的是jcrop(中间遇到很多坑,最终跨越). 图片上传步骤: 1.用户选择图片 2.将图片传入后台:用户选择图片的时候选择的是各种各样的,但是我们的网页显示图片大小是有限的,所以我们就要在用户选择图片之后将图片添加到后台进行压缩,压缩成我们想要的大小,之后再显示到页面才好 3.利用jcrop裁剪工具对图片进行裁剪并且实时预览 4.点击确定按钮将裁剪用到的参数传入后台,后台图片进行剪切,之后缩放成我们需要的格式

  • Python 使用 Pillow 模块给图片添加文字水印的方法

    像微博一类的平台上传图片时,平台都会添加一个水印,宣誓着对图片的所有权,我们自己的博客平台也可以给自己的图片添加上水印. 还是用 Pillow 模块来实现 先来看一个简单的例子 >>> from PIL import Image >>> from PIL import ImageDraw >>> >>> image = Image.open('/Users/wxnacy/Downloads/vm-error1.png') >&g

  • 教你如何用Java替换Word中带有${}的内容

    一.概述 1.因为有些需求,需要把word文档里面的特定数据,设置成可变的:所以需要某种方式,把可变量用标签(如${变量名})替换,通过后端赋值此变量名,重新生成的Word就能根据后端设置的内容变化. 2.替换方法:准备一份word模板文档,如:word_mode.doc(或 word_mode.docx) 文件,把可变内容,用标签${变量名}替换(如图1姓名:${name}) 3.转成可读模板:全部设置完变量标签后,对此word文档进行另存为xml格式的文档(图2),保存后的文件名:word_

  • 教你怎么用Java开发扫雷游戏

    一.效果图        二.实现思路 1.界面上可以点开的各种实际都是按钮,创建9行9列的二维数组,然后根据这个数组来创建JButton. 2.对应创建二维数组data,用来存取数据,0表示周围无雷,-1表示当前是雷,其他数字表示周围雷的数量. 3.对应创建二维数组state,用来存取按钮状态,0未打开,1 打开  2旗子  3 未知(控制显示对应的图标) 4.设置雷:随机行数 i 和列数 j,根据随机到 i.j 从二维数组data中取出对应的元素值,若值不为-1(不是雷),则将此元素data

  • 教你如何用Java简单爬取WebMagic

    一.Java爬虫--WebMagic 1.1 WebMagic总体架构图 1.2 WebMagic核心组件 1.2.1 Downloader 该组件负责从互联网上下载页面.WebMagic默认使用Apache HttpClient作为下载工具. 1.2.2 PageProcessor 该组件负责解析页面,根据我们的业务进行抽取信息.WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析Xpath的工具Xsoup. 1.2.3 Scheduler 该组件负责管理待抓取的URL,以及

  • Java实现的图片上传工具类完整实例

    本文实例讲述了Java实现的图片上传工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; /** * 图片上传工具类 * Created by charlin on 2017/9/10. */ public class UploadImageUtil { private String f

  • java实现的图片裁剪功能示例

    本文实例讲述了java实现的图片裁剪功能.分享给大家供大家参考,具体如下: PicCut.java: package Tsets; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.Iterator; import javax

  • java web中图片验证码功能的简单实现方法

    用户在注册网站信息的时候基本上都要数据验证码验证.那么图片验证码功能该如何实现呢? 大概步骤是: 1.在内存中创建缓存图片 2.设置背景色 3.画边框 4.写字母 5.绘制干扰信息 6.图片输出 废话不多说,直接上代码 package com.lsgjzhuwei.servlet.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.Buffer

  • java截取网页图片的方法

    本文实例讲述了java截取网页图片的方法.分享给大家供大家参考.具体如下: 这是调用第三方控件,然后在读取图片文件存入数据库 public static int GetPic(String URL,String ADid){ String path=CatPath+"iecapt.exe"; Process pro = null; try { pro = Runtime.getRuntime().exec(path + " " + URL + " &quo

随机推荐