java为图片添加图标水印和文字水印

package com.gblfy.test;

import com.gblfy.util.TimeUtil;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

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

/**
 * java为图片添加图标水印和文字水印
 *
 * @author gblfy
 * @version 1.0
 * @explain 文字水印、图片水印
 * @creationTime 2020/07/01
 */
public class WaterMarkUtil {

    /**
     * 将指定图标(png图片)印刷到指定图片上
     * <p>
     * 1.图标图片格式:png
     * 2.坐标轴:
     *    x轴决定左右位置
     *    y轴决定上下位置
     * 3.坐标位置
     *    x值越大距离右越近,反之,x值越小距离左越近;
     *    y值越大距离越往下,反之,y值越小距离越往上
     * </p>
     *
     * @param pressImg  水印图片
     * @param targetImg 源图片路径的目标文件
     * @param x         x坐标
     * @param y         y坐标
     */
    public final static void pressImage(String pressImg, String targetImg, int x, int y) {
        try {
            // 目标文件
            File imageFile = new File(targetImg);
            Image src = ImageIO.read(imageFile);

            int wideth = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
            g.drawImage(src, 0, 0, wideth, height, null);

            // 水印文件
            File waterMarkImage = new File(pressImg);
            Image markImage = ImageIO.read(waterMarkImage);
            int weightMarkImage= markImage.getWidth(null);
            int heightMarkImage = markImage.getHeight(null);

            g.drawImage(markImage, x, y, weightMarkImage, heightMarkImage, null);

            // 水印结束
            g.dispose();
            FileOutputStream out = new FileOutputStream(targetImg);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 打印文字水印图片
     * <p>
     * 1.图标图片格式:png
     * 2.坐标轴:
     *    x轴决定左右位置
     *    y轴决定上下位置
     * 3.坐标位置
     *    x值越大距离右越近,反之,x值越小距离左越近;
     *    y值越大距离越往下,反之,y值越小距离越往上
     * </p>
     *
     * @param pressText 文字
     * @param targetImg 目标图片
     * @param fontName  字体名
     * @param fontStyle 字体样式
     * @param color     字体颜色
     * @param fontSize  字体大小
     * @param x         偏移量
     * @param y         偏移量
     */
    public static void pressText(String pressText, String targetImg, String fontName, int fontStyle, Color color,
                                 int fontSize, int x, int y) {
        try {
            File imageFile = new File(targetImg);
            Image src = ImageIO.read(imageFile);
            int weidth = src.getWidth(null);
            int height = src.getHeight(null);
            BufferedImage image = new BufferedImage(weidth, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = image.createGraphics();
            g.drawImage(src, 0, 0, weidth, height, null);
            g.setColor(color);
            g.setFont(new Font(fontName, fontStyle, fontSize));
            g.drawString(pressText, x, y);
            g.dispose();
            FileOutputStream out = new FileOutputStream(targetImg);
            JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
            encoder.encode(image);
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        String waterMarkImgPath = "D:" + File.separator + "1" + File.separator + "iconPath" + File.separator + "22.png";
        String srcImgPath = "D:" + File.separator + "1" + File.separator + "srcImgPath" + File.separator + "1.jpg";

        System.out.println("水印图标路径:" + waterMarkImgPath);
        System.out.println("图片路径:" + srcImgPath);

        // 1.添加图标水印
        pressImage(waterMarkImgPath, srcImgPath, 100, 500);
        System.out.println("--------------------添加图标水印 执行完成!--------------------");

        String operator = "zhangsan";
        String date = TimeUtil.getCurrentDate().toString();
        String time = TimeUtil.getCurrentTime().toString();

        // 2.添加文字水印
        pressText(operator, srcImgPath, "宋体", 0, Color.BLUE, 30, 540, 600);
        pressText(date, srcImgPath, "宋体", 0, Color.BLUE, 30, 540, 650);
        pressText(time, srcImgPath, "宋体", 0, Color.BLUE, 30, 540, 700);

        System.out.println("--------------------添加文字水印 执行完成!--------------------");
    }

    /**
     *  特别说明:
     *  如上面的效果展示的那样,要想将水印打印到图片指定位置,进行动态设置的话,需要:</p>
     *  第一,原图片大小;</p>
     *  第二,水印大小;</p>
     *  满足这两个条件才能将水印打印到图片的指定位置,也就是可以进行动态位移。&nbsp;</p>
     *  其中,图片水印可以进行动态设置,而文字水印则实现不了,因为我们无法获取文字水印的大小。</p>
     *  调试水印输出位置也是个细致活呀。</p>
     * 另外,水印的偏移量一般情况下均为正值,图片左上角为起点0,0,不同于数学上的Y轴,向下偏移用正值表示。
     */
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gblfy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值