首页 > 编程语言 >Java图片加水印

Java图片加水印

时间:2023-07-10 20:15:03浏览次数:34  
标签:originalImage Java int BufferedImage 水印 加水 graphics new 图片

分为文字水印和透明图片水印

package com.qms.report.util;

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

public class ImageWatermark {
    /**
     * @param waterMarkType 1时代表水印是文本,2代表水印是透明图片
     */
    private void imageWatermark(int waterMarkType) {
        // 原始图片路径
        String imagePath = "/Users/jaki/Desktop/BSQ/QMS/QMS/qms-qc-report/src/main/java/com/qms/report/util/images.jpg";
        // 书印文字
        String watermarkText = "Your Watermark";
        // 书印透明图片地址
        String watermarkImagePath = "path_to_watermark_image.png";
        // 输出路径
        String outputImagePath = "/Users/jaki/Desktop/BSQ/QMS/QMS/qms-qc-report/src/main/java/com/qms/report/util/imagesRemark.jpg";

        try {
            // 原始图片
            BufferedImage originalImage = ImageIO.read(new File(imagePath));
            // 副本(水印)图片
            BufferedImage watermarkedImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);
            // 获取图形
            Graphics2D graphics = (Graphics2D) watermarkedImage.getGraphics();
            // 绘制图片
            graphics.drawImage(originalImage, 0, 0, null);
            graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f));

            if (waterMarkType == 1) {
                // 1时代表水印是文本
                // 字体
                Font font = new Font("Arial", Font.BOLD, 36);
                graphics.setFont(font);
                graphics.setColor(Color.RED);
                // 获取指定字体的规格
                FontMetrics fontMetrics = graphics.getFontMetrics(font);
                int textwidth = fontMetrics.stringWidth(watermarkText);
                int textheight = fontMetrics.getHeight();
                int x = (originalImage.getWidth() - textwidth);
                int y = (originalImage.getHeight() - textheight);
                // 绘制水印
                graphics.drawString(watermarkText, x, y);
            } else {
                // 读取水印图片
                BufferedImage watermarkImage = ImageIO.read(new File(watermarkImagePath));
                int x = (originalImage.getWidth() - watermarkImage.getWidth());
                int y = (originalImage.getHeight() - watermarkImage.getHeight());
                graphics.drawImage(watermarkImage, x, y, null);
            }
            ImageIO.write(watermarkedImage, "jpg", new File(outputImagePath));
            graphics.dispose();
            System.out.println("添加水印结束!");
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void main(String[] args) {
    }
}

标签:originalImage,Java,int,BufferedImage,水印,加水,graphics,new,图片
From: https://www.cnblogs.com/Retired-lad/p/17542181.html

相关文章

  • 每日汇报 第三周第二天 JAVA中的异常处理
    今日所学:掌握什么是异常;区分运行时异常和非运行时异常;掌握try、catch、finally后面代码块发挥的作用;掌握运用try-catch-finally捕获异常;掌握如何运用throws关键字在方法上抛出异常;掌握使用throw关键字为异常创建对象,进而主动印发某种异常明日计划:JAVA中的枚举与泛型......
  • java内存问题排查
    1.查看进程  输入:jps-v  输出:1jar-Xms2g-Xmx2g-XX:SurvivorRatio=4-XX:MetaspaceSize=256M-XX:MaxMetaspaceSize=256M-XX:MaxDirectMemorySize=256M-Dfile.encoding=UTF-8-Duser.timezone=GMT+08  可以查看机器上的java进程,1是进程ID,jar是进程名称,后面是一......
  • java串口通信
    java串口通信importjava.io.*;importjava.util.*;importgnu.io.*;publicclassSerialTestimplementsSerialPortEventListener{SerialPortserialPort;//串口名称privatestaticfinalStringPORT_NAME="/dev/ttyUSB0";//波特率priv......
  • JAVA集成velocity实现对已有模板替换(占位符变量)替换
      平时我们如果有一些简单的模板替换需求,比如有个txt文件,或者代码生成模板文件要根据传入的变量替换成具体的值就可以使用这个框架 依赖<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId>......
  • CVPR 2023 | 南洋理工、商汤提出E3DGE:2D图片秒出3D形象
    前言 在CVPR2023上,南洋理工大学-商汤科技联合实验室S-Lab的研究者提出的基于Encoder的快速3DGANInversion方法,针对现有3DGANinversion方法无法兼顾重建速度、重建质量和编辑质量的问题,提出一种自监督3DGANinversion训练框架。同时,通过构建全局-局部的多尺度结构以及2D-3D......
  • java类和对象学习总结
    当一个引用赋值为null的时候,就代表这个引用不指向任何的对象引用不能指向引用,只能说引用指向了另一个引用的对象.一个引用不能指向多个对象this引用的学习:代表的是当前对象的引用,每一个成员方法的第一个参数默认是thisthis.year this.month   加上this代表给当前的对象......
  • JavaScript加密:常见加密种类、优缺点和代码示例
    当涉及到JavaScript加密时,有多种加密算法和技术可供选择。下面我将列举一些常见的加密种类、它们的优缺点,并提供一些代码案例作为参考。对称加密算法:对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括AES(AdvancedEncryptionStandard)和DES(DataEncryptionS......
  • Java实现浏览器端大文件分片上传实例
    ​ 上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。一开始以为是session过期或者文件大小受系统限制,导致的错误。查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120。但还是不行,有时候10分钟就崩了。同事说,可能是客户这里......
  • 驾驶舱静态图片
      ......
  • 面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?
    前两天在知乎上看到一个问答,说的是:一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通能力......