java 水印测试工具

news/2024/7/7 5:54:38 标签: java, spring boot, elasticsearch

水印测试工具

介绍

在程序中添加了一个增加水印的操作,本地测试都ok,但是在实际使用中发现,服务器不行,打印出来都是方块,经过验证发现是没有安装中文字体,安装字体后就ok了。

你以为这就结束了吗?

当然不是

项目现场要部署在4台linux上面,但是安装完字体后说还是不行,然后就教现场的同事怎么安装字体,怎么部署项目,怎么测试

ok 问题解决了

当然还有后续

这个同事被调去别的项目了,正好现场的服务器被重置了,所有服务器,也就是说得从头来过,

最后没办法就写了这么一个工具,用来测试服务器是否安装字体,安装是否成功,软件水印功能是否ok

其实也挺简单的,就是增加水印的一个jar demo

代码

java">import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;

/**
 * 图片添加水印
 */

public class ImgWaterMark {

    // 水印透明度
    private  float alpha = 0.5f;
    // 水印文字大小
    private   int fontSize = 28;
    // 水印文字字体
    private  Font font = new Font(Font.DIALOG, Font.PLAIN, fontSize);
    // 水印文字颜色
    private  Color color = Color.gray;
    // 水印之间的间隔
    private   int xmove = 200;
    // 水印之间的间隔
    private   int ymove = 200;

    private int  degree = -40;

    private String logoText;

    private ByteArrayOutputStream out;

    //rgb
    public static Color color(int v1,int v2,int v3){
        return new Color(v1,v2,v3);
    }
    //文字加时间
    public static String  timeText(String logoText){

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return logoText + sdf.format(new Date());
    }

    public ImgWaterMark(float alpha,int fontSize ,Color color,int move,int degree){
        this.alpha = alpha;
        this.fontSize = fontSize;
        this.font =  new Font("宋体", Font.PLAIN, this.fontSize);
        this.color = color;
        this.xmove = move;
        this.ymove = move;
        this.degree = degree;
    }

    public ImgWaterMark(String logoText){
        this.logoText = logoText;
        out = new ByteArrayOutputStream();
    }

    /**
     * 创建图片
     * @return
     */
    public ImgWaterMark create(InputStream in,String fileType) throws Exception {
        try {
            Image source = ImageIO.read(in);
            int srcWidth = source.getWidth(null);
            int srcHeight = source.getHeight(null);

            BufferedImage buffImg = new BufferedImage(srcWidth,srcHeight, BufferedImage.TYPE_INT_RGB);
            // 得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(source.getScaledInstance(srcWidth, srcHeight, Image.SCALE_SMOOTH),0, 0, null);
            // 设置水印旋转
            g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);

            // 设置水印文字颜色
            g.setColor(color);

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

            // 设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

            int x = -srcWidth / 2;

            int y = -srcHeight / 2;

            int markWidth = fontSize * getTextLength(logoText);// 字体长度

            int markHeight = fontSize;// 字体高度

            // 循环添加水印
            while (x < srcWidth * 1.5) {

                y = -srcHeight / 2;

                while (y < srcHeight * 1.5) {

                    g.drawString(logoText, x, y);

                    y += markHeight + ymove;

                }

                x += markWidth + xmove;

            }

            // 释放资源
            g.dispose();

            ImageIO.write(buffImg,fileType,out);
        } catch (IOException e) {
            throw new IOException("文件读取失败");
        }

        return this;
    }

    /**
     * 获取文本长度。汉字为1:1,英文和数字为2:1
     */

    private 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 byte[] getData(){
        return out.toByteArray();
    }

    public String getDataBase64(){
         return Base64.getEncoder().encodeToString(getData());
    }


    public static void main(String[] args) throws Exception {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String logoText = "测试图片水印字体" + sdf.format(new Date());

        FileInputStream in = new FileInputStream( "./imgTest.jpg");

        ImgWaterMark img = new ImgWaterMark(logoText);

        img.create(in,"png");

        byte[] data = img.getData();

        OutputStream outFile = new FileOutputStream("./resultimgTest.png");

        outFile.write(data);
        outFile.flush();
        outFile.close();
    }

}

使用

打好包后直接运行就行了,当前目录下会生成一个带水印的图片

java -jar imgTest.jar


http://www.niftyadmin.cn/n/5382027.html

相关文章

OpenAI全新发布文生视频模型:Sora!

OpenAI官网原文链接&#xff1a;https://openai.com/research/video-generation-models-as-world-simulators#fn-20 我们探索视频数据生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用对视频和…

Vue3中 状态管理器 ( Pinia ) 详解及使用

传送门&#xff1a; Vue中 状态管理器&#xff08;vuex&#xff09;详解及应用场景 传送门&#xff1a;Pinia 中文文档 注意&#xff1a;本文项目使用脚手架为 Vite&#xff1b; 1. 前言 Pinia 对比 Vuex Pinia 同时支持 Vue2 以及 Vue3 &#xff0c;这让同时使用两个版本的…

Javaweb之SpringBootWeb案例之AOP通知顺序的详细解析

3.2 通知顺序 讲解完了Spring中AOP所支持的5种通知类型之后&#xff0c;接下来我们再来研究通知的执行顺序。 当在项目开发当中&#xff0c;我们定义了多个切面类&#xff0c;而多个切面类中多个切入点都匹配到了同一个目标方法。此时当目标方法在运行的时候&#xff0c;这多…

Matlab论文插图绘制模板第136期—极坐标气泡图

在之前的文章中&#xff0c;分享了Matlab笛卡尔坐标系的气泡图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一下极坐标气泡图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;本期内容『数据代码』已上传资源群中&#xff0c;加群的朋友请自行下载。有需要的朋…

Spring/SpringBoot 拦截器

Spring/SpringBoot 拦截器 拦截器的作用&#xff1a; 拦截器&#xff0c;可以进行请求过滤、权限管理、打印日志、数据校验等。 拦截器&#xff0c;可以在请求前、请求后进行处理。 代码示例&#xff1a; 拦截器 MyInterceptor: Spring的拦截器&#xff0c;需要实现 Hand…

anomalib1.0学习纪实-续2:三个文件夹

为了读懂程序&#xff0c;有三个最重要的文件夹&#xff0c;如下图&#xff1a; 正好对应四个类&#xff0c;如下图&#xff1a; 四个类的来源如下图所示&#xff1a; 注意&#xff0c;MVTec是个大类&#xff0c;里面用到了这里的第四个类MVTecDataset&#xff0c;代码如下。…

WouoUI-PageVersion 一个用于快速构建具有丝滑OLED_UI动画的项目

WouoUI-PageVersion 写在前面 简介&致谢 Air001的TestUI例子的b站的演示视频 Air001的LittleClock例子的b站演示视频: https://www.bilibili.com/video/BV1J6421g7H1/ Stm32的TestUI例子的b站演示视频: https://www.bilibili.com/video/BV1mS421P7CZ/ 所有演示的工程文…

华纳云:docker更新容器镜像的常用方法

更新 Docker 容器镜像可以通过以下几种方法实现&#xff1a; 1. 使用 docker pull 命令手动拉取更新的镜像&#xff1a; docker pull <镜像名>:<标签> 这会拉取指定镜像的最新版本或者指定标签的版本到本地。然后您可以停止并删除现有的容器&#xff0c;使用新的镜…