Java 实现 图片 添加 文字水印、图片水印 工具类

一、话不多说,直接上代码

1.1,水印类型枚举

import lombok.AllArgsConstructor;
import lombok.Getter;


/**
 * @author: wangjing
 * @createTime: 2023-12-05 15:01
 * @version: 1.0.0
 * @Description: 水印类型枚举
 */
@Getter
@AllArgsConstructor
@SuppressWarnings("AlibabaEnumConstantsMustHaveComment")
public enum WatermarkTypeEnum {

    TEXT_WATERMARK(1, "文字水印"),
    IMAGE_WATERMARK(2, "图片水印");

    private final Integer code;
    private final String msg;

    public static WatermarkTypeEnum matchCode(Integer code) {
        for (WatermarkTypeEnum watermarkTypeEnum : WatermarkTypeEnum.values()) {
            if (code.equals(watermarkTypeEnum.getCode())) {
                return watermarkTypeEnum;
            }
        }
        return null;
    }

}

1.2,图片水印位置类型枚举

import lombok.AllArgsConstructor;
import lombok.Getter;


/**
 * @author: wangjing
 * @createTime: 2023-12-05 15:01
 * @version: 1.0.0
 * @Description: 图片水印位置类型枚举
 */
@Getter
@AllArgsConstructor
@SuppressWarnings("AlibabaEnumConstantsMustHaveComment")
public enum ImageWatermarkPositionTypeEnum {

    /**
     * 九方位
     */
    CENTER(1, "居中"),
    LEFT_SIDE(2, "左侧"),
    RIGHT_SIDE(3, "右侧"),
    DIRECTLY_ABOVE(4, "正上方"),
    DIRECTLY_BELOW(5, "正下方"),
    UPPER_LEFT(6, "左上角"),
    LOWER_LEFT(7, "左下角"),
    UPPER_RIGHT(8, "右上方"),
    LOWER_RIGHT(9, "右下方"),

    /**
     * 平铺
     */
    TILE(10, "平铺水印"),
    TILT_TILE(11, "倾斜平铺");

    private final Integer code;
    private final String msg;

    public static ImageWatermarkPositionTypeEnum matchCode(Integer code) {
        for (ImageWatermarkPositionTypeEnum imageWatermarkPositionTypeEnum : ImageWatermarkPositionTypeEnum.values()) {
            if (code.equals(imageWatermarkPositionTypeEnum.getCode())) {
                return imageWatermarkPositionTypeEnum;
            }
        }
        return null;
    }

}

1.3,图片水印处理类

import cn.piesat.space.watermark.enums.ImageWatermarkPositionTypeEnum;
import cn.piesat.space.watermark.enums.WatermarkTypeEnum;
import lombok.Data;

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

/**
 * @author: wangjing
 * @createTime: 2023-12-05 15:01
 * @version: 1.0.0
 * @Description: 图片水印处理类
 */
public class ImageWatermarkUtil {

    /**
     * 水印信息对象
     */
    @Data
    static class WatermarkInfo {
        BufferedImage watermarkBufferedImage;
        Integer watermarkWidth;
        Integer watermarkHeight;
    }

    /**
     * 获取水印信息并对画布做基础配置
     *
     * @param graphics
     * @param watermarkType
     * @param watermark
     * @param font
     * @param color
     * @return
     */
    public static WatermarkInfo getWatermarkInfo(Graphics2D graphics, Integer watermarkType, String watermark,
                                                 Font font, Color color) {
        WatermarkInfo watermarkInfo = new WatermarkInfo();
        // 文字水印
        if (WatermarkTypeEnum.TEXT_WATERMARK.getCode().equals(watermarkType)) {
            // 设置字体
            graphics.setFont(font);
            // 设置颜色
            graphics.setColor(color);
            watermarkInfo.setWatermarkWidth(getWatermarkLength(watermark, graphics));
            watermarkInfo.setWatermarkHeight(font.getSize());
        } else {
            // 图片水印BufferedImage对象
            BufferedImage watermarkBufferedImage = readPicture(watermark);
            watermarkInfo.setWatermarkBufferedImage(watermarkBufferedImage);
            watermarkInfo.setWatermarkWidth(watermarkBufferedImage.getWidth());
            watermarkInfo.setWatermarkHeight(watermarkBufferedImage.getHeight());
        }
        return watermarkInfo;
    }

    /**
     * 添加水印
     *
     * @param bufferedImage              源文件
     * @param font                       字体
     * @param color                      颜色
     * @param watermarkType              水印类型(具体见 WatermarkTypeEnum 枚举类)
     * @param imageWatermarkPositionType 水印位置(具体见 ImageWatermarkPositionType)
     * @param watermark                  水印(文字或图片地址)
     * @return
     */
    public static BufferedImage addWatermark(BufferedImage bufferedImage, Font font, Color color, Integer watermarkType,
                                             Integer imageWatermarkPositionType, String watermark) {
        // 图片宽度
        Integer imageWidth = bufferedImage.getWidth();
        // 图片高度
        Integer imageHeight = bufferedImage.getHeight();
        // 创建画笔
        Graphics2D graphics = bufferedImage.createGraphics();

        WatermarkInfo watermarkInfo = getWatermarkInfo(graphics, watermarkType, watermark, font, color);

        switch (ImageWatermarkPositionTypeEnum.matchCode(imageWatermarkPositionType)) {
            // 居中
            case CENTER:
                centerCompute(graphics, imageWidth, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 左侧
            case LEFT_SIDE:
                leftSideCompute(graphics, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 右侧
            case RIGHT_SIDE:
                rightSideCompute(graphics, imageWidth, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 正上方
            case DIRECTLY_ABOVE:
                directlyAboveCompute(graphics, imageWidth, watermarkInfo, watermarkType, watermark);
                break;
            // 正下方
            case DIRECTLY_BELOW:
                directlyBelowCompute(graphics, imageWidth, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 左上角
            case UPPER_LEFT:
                upperLeftCompute(graphics, watermarkInfo, watermarkType, watermark);
                break;
            // 左下角
            case LOWER_LEFT:
                lowerLeftCompute(graphics, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 右上角
            case UPPER_RIGHT:
                upperRightCompute(graphics, imageWidth, watermarkInfo, watermarkType, watermark);
                break;
            // 右下角
            case LOWER_RIGHT:
                lowerRightCompute(graphics, imageWidth, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 右下角
            case TILE:
                tileDrawCompute(graphics, imageWidth, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            // 右下角
            case TILT_TILE:
                // 倾斜度
                graphics.rotate(0.2);
                tileDrawCompute(graphics, imageWidth, imageHeight, watermarkInfo, watermarkType, watermark);
                break;
            default: // 错误的操作类型
                throw new RuntimeException("错误的操作类型");
        }
        graphics.dispose();
        return bufferedImage;
    }

    /**
     * 居中 配置
     *
     * @param graphics
     * @param imageWidth
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void centerCompute(Graphics2D graphics, Integer imageWidth, Integer imageHeight,
                                     WatermarkInfo watermarkInfo, Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = (imageWidth - watermarkInfo.getWatermarkWidth()) / 2;
        Integer y = imageHeight / 2 + (watermarkInfo.getWatermarkHeight() / 2);
        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 左侧 配置
     *
     * @param graphics
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void leftSideCompute(Graphics2D graphics, Integer imageHeight, WatermarkInfo watermarkInfo,
                                       Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = 0;
        Integer y = (imageHeight + watermarkInfo.getWatermarkHeight()) / 2;
        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 右侧配置
     *
     * @param graphics
     * @param imageWidth
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void rightSideCompute(Graphics2D graphics, Integer imageWidth, Integer imageHeight,
                                        WatermarkInfo watermarkInfo, Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = imageWidth - watermarkInfo.getWatermarkWidth();
        Integer y = (imageHeight + watermarkInfo.getWatermarkHeight()) / 2;

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 正上方配置
     *
     * @param graphics
     * @param imageWidth
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void directlyAboveCompute(Graphics2D graphics, Integer imageWidth, WatermarkInfo watermarkInfo,
                                            Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = (imageWidth - watermarkInfo.getWatermarkWidth()) / 2;
        Integer y = watermarkInfo.getWatermarkHeight();

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 正下方
     *
     * @param graphics
     * @param imageWidth
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void directlyBelowCompute(Graphics2D graphics, Integer imageWidth, Integer imageHeight,
                                            WatermarkInfo watermarkInfo, Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = (imageWidth - watermarkInfo.getWatermarkWidth()) / 2;
        Integer y = imageHeight;

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 左上角
     *
     * @param graphics
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void upperLeftCompute(Graphics2D graphics, WatermarkInfo watermarkInfo, Integer watermarkType,
                                        String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = 0;
        Integer y = watermarkInfo.getWatermarkHeight();

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 左下角
     *
     * @param graphics
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void lowerLeftCompute(Graphics2D graphics, Integer imageHeight, WatermarkInfo watermarkInfo,
                                        Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = 0;
        Integer y = imageHeight;

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 右上方
     *
     * @param graphics
     * @param imageWidth
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void upperRightCompute(Graphics2D graphics, Integer imageWidth, WatermarkInfo watermarkInfo,
                                         Integer watermarkType, String watermark) {
        // 设置水印的坐标(为原图片中间位置)
        Integer x = imageWidth - watermarkInfo.getWatermarkWidth();
        Integer y = watermarkInfo.getWatermarkHeight();

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 右下方
     *
     * @param graphics
     * @param imageWidth
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void lowerRightCompute(Graphics2D graphics, Integer imageWidth, Integer imageHeight,
                                         WatermarkInfo watermarkInfo, Integer watermarkType, String watermark) {

        // 设置水印的坐标(为原图片中间位置)
        Integer x = imageWidth - watermarkInfo.getWatermarkWidth();
        Integer y = imageHeight;

        drawTestOrImage(graphics, x, y, watermarkType, watermark, watermarkInfo);
    }

    /**
     * 平铺
     *
     * @param graphics
     * @param imageWidth
     * @param imageHeight
     * @param watermarkInfo
     * @param watermarkType
     * @param watermark
     */
    public static void tileDrawCompute(Graphics2D graphics, Integer imageWidth, Integer imageHeight,
                                       WatermarkInfo watermarkInfo, Integer watermarkType, String watermark) {

        Integer watermarkHeight = watermarkInfo.getWatermarkHeight();
        Integer watermarkWidth = watermarkInfo.getWatermarkWidth();
        // 间隔
        Integer split = watermarkHeight * 2;

        // x,y可以绘制的数量,多加一个补充空白
        int xCanNum = imageWidth / watermarkWidth + 1;
        int yCanNum = imageHeight / watermarkHeight + 1;
        for (int i = 1; i <= yCanNum; i++) {
            int y = watermarkHeight * i + split * i;
            for (int j = 0; j < xCanNum; j++) {
                int x = watermarkWidth * j + split * j;
                drawTestOrImage(graphics, x, y - (watermarkHeight + split) * j, watermarkType, watermark,
                        watermarkInfo);
            }
        }
    }

    /**
     * 画文字水印或图片水印
     *
     * @param graphics
     * @param x
     * @param y
     * @param watermarkType
     * @param watermark
     * @param watermarkInfo
     */
    public static void drawTestOrImage(Graphics2D graphics, int x, int y, Integer watermarkType, String watermark,
                                       WatermarkInfo watermarkInfo) {

        // 文字水印
        if (WatermarkTypeEnum.TEXT_WATERMARK.getCode().equals(watermarkType)) {
            graphics.drawString(watermark, x, y);
        } else {
            // 图片水印
            graphics.drawImage(watermarkInfo.getWatermarkBufferedImage(), x, y - watermarkInfo.getWatermarkHeight(), watermarkInfo.getWatermarkWidth(),
                    watermarkInfo.getWatermarkHeight(), null);
        }
    }

    /**
     * 获取水印文字的长度
     *
     * @param watermarkContent 文字水印内容
     * @param graphics         图像类
     * @return
     */
    private static Integer getWatermarkLength(String watermarkContent, Graphics2D graphics) {
        return graphics.getFontMetrics(graphics.getFont()).charsWidth(watermarkContent.toCharArray(), 0,
                watermarkContent.length());
    }

    /**
     * 将图片写入到指定位置
     *
     * @param bufImg
     * @param tarImgPath
     */
    public static void writeImage(BufferedImage bufImg, String tarImgPath) {
        // 输出图片
        try {
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "png", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * 读取图片
     *
     * @param path
     * @return
     */
    public static BufferedImage readPicture(String path) {
        try {
            // 尝试获取本地
            return readLocalPicture(path);
        } catch (Exception e) {
            // 尝试获取网路
            return readNetworkPicture(path);
        }
    }

    /**
     * 读取本地图片
     *
     * @param path
     * @return
     */
    public static BufferedImage readLocalPicture(String path) {
        if (null == path) {
            throw new RuntimeException("本地图片路径不能为空");
        }
        // 读取原图片信息 得到文件
        File srcImgFile = new File(path);
        try {
            // 将文件对象转化为图片对象
            return ImageIO.read(srcImgFile);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 读取网络图片
     *
     * @param path 网络图片地址
     */
    public static BufferedImage readNetworkPicture(String path) {
        if (null == path) {
            throw new RuntimeException("网络图片路径不能为空");
        }
        try {
            // 创建一个URL对象,获取网络图片的地址信息
            URL url = new URL(path);
            // 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
            BufferedImage bugImg = ImageIO.read(url.openStream());
            if (null == bugImg) {
                throw new RuntimeException("网络图片地址不正确");
            }
            return bugImg;
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 文字类型测试
     * @param args
     */
    public static void main(String[] args) {

        // 要处理的图片路径:
        String localPath = "/Users/wangjing/Desktop/watermark/image/test1.jpg";

        // 定义存储的地址
        String tarImgPath = "/Users/wangjing/Desktop/watermark/image/";

        // 文字水印内容
        String textWatermark = "刘亦菲";

        // 根据图片的背景设置水印颜色
        Color color = new Color(255, 255, 255, 128);
        // 设置字体  画笔字体样式为微软雅黑,加粗,文字大小为45pt
        Font font = new Font("微软雅黑", Font.BOLD, 45);

        for (int i = 1; i < 12; i++) {
            BufferedImage bufferedImage = readPicture(localPath);
            BufferedImage test = addWatermark(bufferedImage, font, color, WatermarkTypeEnum.TEXT_WATERMARK.getCode(),
                    i, textWatermark);
            writeImage(test, tarImgPath + "watermark_text_" + i + ".jpg");
        }

    }

    /**
     * 图片水印测试
     *
     * @param args
     */
//    public static void main(String[] args) {
//
//        // 要处理的图片路径:
//        String localPath = "https://vrar-obs-production.obs.cn-north-4.myhuaweicloud.com/survey/watermark/image.jpg";
//
//        // 定义存储的地址
//        String tarImgPath = "/Users/wangjing/Desktop/watermark/image/";
//
//        // 图片水印内容
//        String textWatermark = "https://vrar-obs-production.obs.cn-north-4.myhuaweicloud" +
//                ".com/survey/watermark/watermark.png";
//
//
//        for (int i = 1; i < 12; i++) {
//            BufferedImage bufferedImage = readPicture(localPath);
//            BufferedImage test = addWatermark(bufferedImage, null, null, WatermarkTypeEnum.IMAGE_WATERMARK.getCode(), i,
//                    textWatermark);
//            writeImage(test, tarImgPath + "watermark_image_" + i + ".jpg");
//        }
//    }


}

二、看效果

2.1,原图

2.2,文字水印生成效果

2.3,水印图片

2.4,图片水印生成效果

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/222727.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

已解决error: (-215:Assertion failed) inv_scale_x > 0 in function ‘cv::resize‘

需求背景 欲使用opencv的resize函数将图像沿着纵轴放大一倍&#xff0c;即原来的图像大小为(384, 512), 现在需要将图像放大为(768, 512)。 源码 import cv2 import numpy as np# 生成初始图像 img np.zeros((384, 512), dtypenp.uint8) img[172:212, 32:-32] 255 H, W …

天池SQL训练营(二)-SQL基础查询与排序

-天池龙珠计划SQL训练营 Task02&#xff1a;SQL基础查询与排序 SQL训练营页面地址&#xff1a;https://tianchi.aliyun.com/specials/promotion/aicampsql 一、SELECT语句基础 1.1 从表中选取数据 SELECT语句 从表中选取数据时需要使用SELECT语句&#xff0c;也就是只从表…

机器学习---线性回归算法

1、什么是回归&#xff1f; 从大量的函数结果和自变量反推回函数表达式的过程就是回归。线性回归是利用数理统计中回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。 2、一元线性回归 3、多元线性回归 如果回归分析中包括两个或两个以上的自变量&a…

基于springboot校园二手平台的开发与设计

目 录 1 绪论 1 1.1 课题研究背景 1 1.2 研究意义 1 1.3 研究的目标 2 2 系统技术选型 3 2.1 数据库选择 3 2.2 开发工具的选择 3 2.3 后端框架选择 3 2.4 前端框架选择 3 3 系统需求和可行性分析 4 3.1 总体设计原则 4 3.2 需求分析 4 3.3 可行性分析 5 3.3.1 技术可行性 5 3…

我想修改vCenter IP地址

部署vCenter Server Appliance后&#xff0c;您可以在vCenter修改DNS设置并选择域名服务器使用。您可以编辑vCenter Server Appliance的IP地址设置。从vSphere 6.5开始正式支持vCenter修改IP地址。因此可以更改vCenter Server Appliance的IP地址和DNS设置。 注意&#xff1a;更…

shein、亚马逊卖家测评如何利用自养买家号提升购买转化率?

自养买家号测评的作用&#xff0c;对于众多卖家来说&#xff0c;恐怕并不陌生。它可以快速注入评论&#xff0c;提升排名&#xff0c;创建热卖商品的一种催化剂。在当前电子商务行业蓬勃发展的背景下&#xff0c;买家号的重要性越来越凸显。 买家会花时间浏览店铺的评价&#…

Unity随笔1 - 安卓打包JDK not found

今天遇到一个很奇怪的事情&#xff0c;之前可以正常打安卓包&#xff0c;但是突然报错如下&#xff1a; 提示很明显&#xff0c;找不到JDK了。可是我在下载Unity的时候明明安装了所有需要的组件&#xff0c;为什么今天突然不行。 看了眼Unity hub里面&#xff0c;没问题。 那就…

一文了解直流稳压电源调试方法

直流稳压电源是是一种将交流或直流电源转换为稳定直流电压的电子装置&#xff0c;被广泛应用于国防、科研、医疗、通讯、工业自动化设备等领域。 直流稳压电源一般由变压器、整流电路、滤波电路和稳压电路组成。变压器会将交流电源转换为所需的电源电压&#xff0c;整流电路将交…

Leetcode—383.赎金信【简单】

2023每日刷题&#xff08;五十&#xff09; Leetcode—383.赎金信 实现代码 class Solution { public:int arr[26] {0};int arr2[26] {0};bool canConstruct(string ransomNote, string magazine) {int len ransomNote.size();int len2 magazine.size();for(int i 0; i …

csv文件中账号数字显示为科学计数法1.23E+16

参见&#xff1a; 如何解决导出csv文件数字自动变为科学计数法&#xff08;数值中带E&#xff09;_csv格式数字老是变成什么e-CSDN博客 其中&#xff0c;在倒数第2张图 里 选“新工作表”。

什么是LIMS实验室信息管理系统 LIMS系统功能介绍

实验室信息管理系统&#xff0c;也称为 LIMS系统&#xff0c;是一种软件解决方案&#xff0c;它通过自动化手动流程来支持现代实验室操作。因此&#xff0c;生命科学专业人员可以实时访问准确无误的信息。该软件使用户能够更有效地管理样本、分析相关数据并根据相关数据采取行动…

智能优化算法应用:基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于人工水母算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工水母算法4.实验参数设定5.算法结果6.参考…

云架构的思考2--云上架构

目录 1 云架构考虑因素2 云架构设计步骤2.1 梳理需求2.1.1 功能需求2.1.2 非功能需求 2.2 业务架构2.3 设定合理预期2.4 确认应用程序迁移云端、托管或者重新编写&#xff08;可选&#xff09;2.5 选择云服务模式和部署模式2.5.1 选择云服务模式2.5.2 选择部署模式2.5.3 格外的…

海思3516DV500下的目标识别算法运行评估,包含yolov7,yolov8

目前在3516DV500下&#xff0c;自己训练的模型的评估实测结果。根据实际模型会有些许差异。 涉及到技术细节的部分因为商业用途&#xff0c;有部分省略。如需相关技术服务项目合作可私信联系。 我司推出的目标识别跟踪模块&#xff0c;支持热红外、可见光主流多光谱视频输入与目…

异常追踪与 JIRA 实现双向联动

前言 当应用程序或系统出现异常时&#xff0c;通常需要及时处理以保证系统的正常运行。通过异常追踪与 JIRA 双向联动&#xff0c;可以让企业内部相关人员快速了解、分析问题故障发生的原因、追溯并记录故障的处理过程&#xff0c;有效提高人员的沟通效率&#xff0c;极大降低…

java--成员内部类、静态内部类、局部内部类

1.内部类 ①是类中的五大成分之一(成员变量、成员方法、构造器、内部类、代码块)&#xff0c;如果一个类定义另外一个类的内部&#xff0c;这个类就是内部类。 ②场景&#xff1a;当一个类的内部&#xff0c;包含了一个完整的事物&#xff0c;且这个事务没必要单独设计时&…

掌控安全 暖冬杯 CTF Writeup By AheadSec

本来结束时发到了学校AheadSec的群里面了的&#xff0c;觉得这比赛没啥好外发WP的&#xff0c;但是有些师傅来问了&#xff0c;所以还是发一下吧。 文章目录 Web签到&#xff1a;又一个计算题计算器PHP反序列化又一个PHP反序列化 Misc这是邹节伦的桌面背景图什么鬼&#xff1f;…

Linux学习笔记之七(shell脚本的基本语法)

Shell 1、Shell脚本2、常用运算符2、特殊语法4、关于变量的一些命令4.1、echo4.2、export4.3、read4.4、declare/typeset4.5、local4.6、unset 5、基本逻辑语法5.1、if判断5.2、for循环5.3、while循环5.4、case语句 6、函数定义7、多脚本链接 1、Shell脚本 学习shell脚本开发之…

Halcon深度学习,语义分割,预处理和部署过程

halcon在深度学习中提供了7种学习方式和例子。其中最为常见的为语义分割&#xff0c;一般使用与在需要标注显示的缺陷检测项目中。几乎所有的2D缺陷检测都可以使用语义分割作为项目部署。 先上完整程序 预处理部分 *** 设置输入输出路径 *** *总路径 AllDir : E:/HALCONDeepin…

JavaScript的一个代码小挑战

题目 我们正在开发一个足球投注应用程序! 假设我们从一个网络服务获取了一场比赛的数据&#xff08;如下所示&#xff09;。在这个挑战中&#xff0c;我们将处理这些数据。这里是你的任务&#xff1a; const game {team1: Bayern Munich,team2: Borrussia Dortmund,players:…