OpenCV图像添加水印
一、前言
在数字图像处理中,为图片添加水印是一项常见且重要的技术。无论是版权保护、品牌宣传还是防止未经授权的使用,水印都能发挥重要作用。OpenCV作为一款强大的计算机视觉库,提供了丰富的功能来实现各种水印效果。本教程将详细介绍如何使用OpenCV为图像添加文字水印和图片水印。
二、环境准备
在开始之前,请确保已安装以下环境:
-
Python 3.x
-
OpenCV库(可通过
pip install opencv-python
安装) -
NumPy库(OpenCV依赖)
# 导入必要的库
import cv2 # OpenCV库,用于图像处理
import numpy as np # NumPy库,用于数值计算print("环境准备完成,OpenCV版本:", cv2.__version__)
三、文字水印实现
3.1 基本文字水印
OpenCV提供了cv2.putText()
函数来在图像上添加文字。我们先来看这个函数的基本用法:
cv2.putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)
参数详解:
-
img
: 要添加文字的图像(numpy数组) -
text
: 要添加的文字字符串 -
org
: 文字左下角的坐标(对于bottomLeftOrigin=False
的情况),格式为(x, y) -
fontFace
: 字体类型,常用的有:-
cv2.FONT_HERSHEY_SIMPLEX
: 普通大小无衬线字体 -
cv2.FONT_HERSHEY_PLAIN
: 小号无衬线字体 -
cv2.FONT_HERSHEY_DUPLEX
: 普通大小无衬线字体(比SIMPLEX更复杂) -
cv2.FONT_HERSHEY_COMPLEX
: 普通大小衬线字体 -
cv2.FONT_HERSHEY_TRIPLEX
: 普通大小衬线字体(比COMPLEX更复杂) -
cv2.FONT_HERSHEY_COMPLEX_SMALL
: 小号COMPLEX字体 -
cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
: 手写风格字体 -
cv2.FONT_HERSHEY_SCRIPT_COMPLEX
: 更复杂的手写风格字体
-
-
fontScale
: 字体缩放因子,影响字体大小 -
color
: 文字颜色,BGR格式的元组,如(255, 0, 0)表示蓝色 -
thickness
: 文字线条粗细(可选,默认为1) -
lineType
: 线条类型(可选,默认为cv2.LINE_8) -
bottomLeftOrigin
: 如果为True,org参数表示文字的左上角而非左下角(可选,默认为False)
示例代码:
# 读取图像
image = cv2.imread('input.jpg')# 设置水印文字参数
text = "Sample Watermark"
position = (50, 50) # 从图像左上角开始的坐标
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1
color = (255, 0, 0) # 蓝色
thickness = 2
line_type = cv2.LINE_AA # 抗锯齿线型# 添加文字水印
cv2.putText(image, text, position, font, font_scale, color, thickness, line_type)# 保存结果
cv2.imwrite('output_with_text.jpg', image)
3.2 透明文字水印
为了使水印更加美观且不影响原图内容,我们可以创建半透明的水印效果:
def add_transparent_watermark(input_path, output_path):"""添加半透明文字水印函数参数:input_path (str): 输入图片路径output_path (str): 输出图片路径功能:1. 创建原始图像的副本2. 在副本上添加白色文字3. 将副本与原图按透明度混合4. 保存输出图片"""# 读取原始图像original_image = cv2.imread(input_path)if original_image is None:print(f"错误:无法加载图片 {input_path}")return# 创建原始图像的副本# overlay将用于添加水印,output将保存最终结果overlay = original_image.copy()output = original_image.copy()# 水印文字参数设置watermark_text = "WATERMARK" # 水印文字内容text_position = (50, 100) # 文字位置(x,y)# 使用较复杂的字体# cv2.FONT_HERSHEY_COMPLEX: 普通大小衬线字体font_type = cv2.FONT_HERSHEY_COMPLEX font_size = 1.5 # 较大的字体尺寸text_color = (255, 255, 255) # 白色文字thickness = 3 # 较粗的线条# 在overlay上添加文字(此时文字是完全不透明的)cv2.putText(overlay,watermark_text,text_position,font_type,font_size,text_color,thickness,cv2.LINE_AA)# 设置透明度# alpha=0.6表示水印60%不透明,原图40%可见alpha = 0.6 """cv2.addWeighted()函数参数详解:src1: 第一个输入数组(overlay)alpha: 第一个数组的权重src2: 第二个输入数组(output)beta: 第二个数组的权重gamma: 标量,添加到每个和的标量dst: 输出数组dtype: 输出数组的可选深度"""# 将overlay和output按透明度混合cv2.addWeighted(overlay, # 有水印的图像alpha, # 水印图像的权重output, # 原始图像1 - alpha, # 原始图像的权重0, # 添加到每个和的标量output # 输出图像)# 保存结果if cv2.imwrite(output_path, output):print(f"透明水印添加成功,结果已保存到 {output_path}")else:print(f"错误:无法保存图片到 {output_path}")# 使用示例
add_transparent_watermark(input_path="input.jpg",output_path="output_transparent.jpg"
)
3.3 多行文字与文字属性获取
有时我们需要添加多行文字或计算文字占据的空间:
def add_multiline_text(image, text_lines=["LINE 1", "LINE 2", "LINE 3"], position=(20, 50), font=cv2.FONT_HERSHEY_PLAIN, font_scale=1.8, color=(0, 255, 0), line_spacing=40):x, y = positionfor line in text_lines:cv2.putText(image, line, (x, y), font, font_scale, color, 2, cv2.LINE_AA)y += line_spacingreturn image# 使用示例
image = cv2.imread('input.jpg')
watermarked = add_multiline_text(image)
cv2.imwrite('output_multiline.jpg', watermarked)
四、图片水印实现
除了文字水印,我们还可以将另一张图片作为水印添加到主图上。
4.1 基本图片水印
def add_image_watermark(background, watermark, position=(50, 50), alpha=0.4):h, w = watermark.shape[:2]roi = background[position[1]:position[1]+h, position[0]:position[0]+w]result = cv2.addWeighted(roi, 1, watermark, alpha, 0)background[position[1]:position[1]+h, position[0]:position[0]+w] = resultreturn background# 使用示例
background = cv2.imread('background.jpg')
watermark = cv2.imread('logo.png') # 水印图片路径# 调整水印大小
watermark = cv2.resize(watermark, (100, 50)) # 固定尺寸100x50像素watermarked = add_image_watermark(background, watermark)
cv2.imwrite('output_with_logo.jpg', watermarked)
4.2 平铺水印效果
有时我们需要在整个图片上平铺水印:
def add_tiled_watermark(background, watermark, scale=0.1, alpha=0.3):"""添加平铺水印效果参数:background: 背景图像watermark: 水印图像scale: 水印缩放比例alpha: 透明度"""# 调整水印大小h, w = background.shape[:2]watermark = cv2.resize(watermark, (0, 0), fx=scale, fy=scale)wh, ww = watermark.shape[:2]# 计算平铺的行列数rows = h // wh + 1cols = w // ww + 1# 创建水印平铺图像tiled = np.tile(watermark, (rows, cols, 1))tiled = tiled[:h, :w]# 混合图像result = cv2.addWeighted(background, 1, tiled, alpha, 0)return result# 使用示例
background = cv2.imread('background.jpg')
watermark = cv2.imread('logo.png')result = add_tiled_watermark(background, watermark, scale=0.2, alpha=0.2)
cv2.imwrite('output_tiled.jpg', result)
五、高级水印技术
5.1 斜角水印
斜角水印是一种以对角线方向重复排列的水印设计方式,它通过在图像上沿斜线方向(通常是45度角)均匀分布水印元素(文字或Logo),形成有规律的网格化视觉效果。
def add_diagonal_pattern_watermark(input_path, output_path):"""添加斜角重复水印函数参数:input_path (str): 输入图片路径output_path (str): 输出图片路径功能:1. 创建图像副本2. 计算图像对角线长度3. 沿对角线方向重复添加水印文字4. 与原图混合5. 保存结果"""# 读取原始图像image = cv2.imread(input_path)if image is None:print(f"错误:无法加载图片 {input_path}")return# 创建原始图像的副本overlay = image.copy()output = image.copy()# 获取图像尺寸height, width = image.shape[:2]print(f"图像尺寸: 宽度={width}, 高度={height}")# 水印文字参数watermark_text = "SAMPLE" # 水印文字内容font_type = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX # 手写风格字体font_size = 1.8 # 较大的字体text_color = (200, 200, 200) # 浅灰色# 计算图像对角线长度(勾股定理)diagonal_length = int(np.sqrt(height**2 + width**2))print(f"图像对角线长度: {diagonal_length}像素")# 设置水印间距spacing = 120 # 水印之间的间隔(像素)# 计算需要多少个水印num_watermarks = diagonal_length // spacing + 1print(f"将添加约 {num_watermarks} 个水印")# 添加斜角水印for i in range(-num_watermarks, num_watermarks + 1):# 计算每条斜线的起始x坐标x_start = i * spacing# 沿斜线方向放置水印for j in range(0, diagonal_length, spacing):x = x_start + j # 当前x坐标y = j # 当前y坐标# 检查坐标是否在图像范围内if 0 <= x < width and 0 <= y < height:cv2.putText(overlay,watermark_text,(x, y), # 当前位置font_type,font_size,text_color,2, # 线条粗细cv2.LINE_AA)# 设置水印整体透明度alpha = 0.15 # 水印不透明度(15%)# 混合图像cv2.addWeighted(overlay, # 有水印的图像alpha, # 水印权重output, # 原始图像1 - alpha, # 原始图像权重0, # 标量值output # 输出图像)# 保存结果if cv2.imwrite(output_path, output):print(f"斜角水印添加成功,结果已保存到 {output_path}")else:print(f"错误:无法保存图片到 {output_path}")# 使用示例
add_diagonal_pattern_watermark(input_path="input.jpg",output_path="output_diagonal.jpg"
)
5.2 自适应水印位置
def add_adaptive_watermark(image, text, font, font_scale, color, alpha=0.5):"""根据图像内容自适应选择水印位置参数:image: 原始图像text: 水印文字font: 字体类型font_scale: 字体大小color: 文字颜色alpha: 透明度"""# 转换为灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算图像梯度grad_x = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=3)grad_y = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3)magnitude = np.sqrt(grad_x**2 + grad_y**2)# 获取文本尺寸(text_width, text_height), _ = cv2.getTextSize(text, font, font_scale, thickness=2)# 寻找梯度最小的区域放置水印min_magnitude = float('inf')best_position = (0, 0)for y in range(0, image.shape[0] - text_height, 10):for x in range(0, image.shape[1] - text_width, 10):region = magnitude[y:y+text_height, x:x+text_width]current_magnitude = np.mean(region)if current_magnitude < min_magnitude:min_magnitude = current_magnitudebest_position = (x, y + text_height) # putText使用左下角坐标# 添加水印overlay = image.copy()output = image.copy()cv2.putText(overlay, text, best_position, font, font_scale, color, 2, cv2.LINE_AA)cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output)return output# 使用示例
image = cv2.imread('input.jpg')
watermarked = add_adaptive_watermark(image, "ADAPTIVE", cv2.FONT_HERSHEY_COMPLEX, 1.2, (0, 0, 255), 0.6)
cv2.imwrite('output_adaptive.jpg', watermarked)
六、水印安全与反去除
为了提高水印的安全性,防止轻易被去除,可以考虑以下技术:
-
频域水印:将水印嵌入到图像的频域中(如DCT或DWT变换域)
-
随机点水印:在图像中随机位置添加微小的像素变化
-
多重水印:结合文字和图片水印,在不同位置添加
def add_frequency_domain_watermark(image, watermark_text, strength=0.1):"""在频域添加简单文字水印参数:image: 原始图像watermark_text: 水印文字strength: 水印强度"""# 将图像转换为YCrCb颜色空间,只对亮度通道(Y)进行操作ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)y = ycrcb[:, :, 0].astype(np.float32)# 执行DCT变换dct = cv2.dct(y)# 创建水印模式watermark = np.zeros_like(y)cv2.putText(watermark, watermark_text, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, 255, 2, cv2.LINE_AA)watermark = cv2.resize(watermark, (dct.shape[1], dct.shape[0]))# 在频域添加水印dct_watermarked = dct + watermark * strength# 执行逆DCT变换y_watermarked = cv2.idct(dct_watermarked)# 将结果放回原图像ycrcb[:, :, 0] = np.clip(y_watermarked, 0, 255)watermarked = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)return watermarked# 使用示例
image = cv2.imread('input.jpg')
watermarked = add_frequency_domain_watermark(image, "FREQ_DOMAIN", 0.05)
cv2.imwrite('output_frequency.jpg', watermarked)
七、总结
本教程详细介绍了使用OpenCV添加各种水印的方法,包括:
-
基本文字水印和透明文字水印
-
多行文字水印和文字属性处理
-
图片水印和透明图片水印
-
平铺水印和斜角水印效果
-
自适应水印位置选择
-
频域水印等高级技术
每种方法都提供了详细的参数解释和示例代码,读者可以根据自己的需求选择合适的水印方式。在实际应用中,可能需要结合多种技术来提高水印的效果和安全性。
希望本教程能够帮助您掌握OpenCV添加水印的各种技巧,为您的图像处理项目提供有价值的参考。
相关文章:
OpenCV图像添加水印
一、前言 在数字图像处理中,为图片添加水印是一项常见且重要的技术。无论是版权保护、品牌宣传还是防止未经授权的使用,水印都能发挥重要作用。OpenCV作为一款强大的计算机视觉库,提供了丰富的功能来实现各种水印效果。本教程将详细介绍如何…...
Linux信号机制:从入门到精通
嘿,小伙伴们!今天我要和大家聊一个Linux系统中非常有趣又重要的话题——信号机制。别担心,虽然信号听起来有点高深,但我会用最通俗易懂的语言,配合清晰的图表,带你彻底搞懂这个概念! 什么是信号…...
EXCEL数据报表
客单价成交金额*成交客户数 —— 提取年份 YEAR() 视图-窗口-新建窗口,就能将excel的一个子表格单拎出来成为独立窗口,方便对比查看 数据报表的单元格尽量都用公式来填补,链接到源表上去。这样当源表有新数据更新进来后,报表也…...
openGL学习(VAO和VBO)
理论 VBO void prepare() {//创建一个VBO,但是还没有分配显存GLuint vbo 0;GL_CALL( glGenBuffers(1, &vbo));cout << "vbo " << vbo << endl;//销毁一个VBOGL_CALL(glDeleteBuffers(1, &vbo));cout << "delete vbo "…...
【请关注】制造企业机械加工数据脱敏解决方案
制造企业机械加工数据脱敏解决方案 一、方案概述 在制造企业尤其是机械加工领域,数字化转型带来了生产效率的大幅提升,大量生产数据、设备运行数据、供应链数据以及客户订单数据等成为企业发展的关键驱动力。然而,这些数据中包含众多敏感信息,如客户定制产品的设计图纸(…...
2025.6.27总结
最近工作又开始内耗了,一位同事的转岗直接让我破防了,明明他工作干得很不错,会得又多,性格又好,我还经常请教他业务上的问题。我和他的关系并不算太好,但他加入其他部门,竟然让我有些不舍&#…...
Python打卡:Day38
知识点回顾: Dataset类的__getitem__和__len__方法(本质是python的特殊方法)Dataloader类minist手写数据集的了解 浙大疏锦行...
Ubuntu18.04/Mysql 5.7 建立主备模式Mysql集群
一、数据库的安装 详见https://www.jianshu.com/p/5073177eedf2 本文实验环境为阿里云的两台ubuntu18.04服务器: master ip: 172.26.138.7 slave ip: 172.26.0.209 二、修改Master的配置(# 的行是我后增加的部分): 编辑 /etc/mysql/mysql.conf.d/mysqld.…...
Linux journal 日志大小限制与管理详解
文章目录 Linux journal 日志大小限制与管理详解journal 日志的默认存储位置journal 日志大小限制配置查看当前日志占用情况手动清理日志文件按大小清理日志按时间清理日志按文件数清理日志 journald 日志机制原理简析(适当加点原理)日志筛选与导出技巧&…...
Linux基本指令篇 —— tac指令
tac 是 Linux 系统中一个非常实用的文本处理命令,它是 cat 命令的反向操作(名称也是 "cat" 的反写)。tac 是一个简单但功能强大的工具,特别适合需要反向处理文本数据的场景: 目录 一、基本功能 二、基本语法…...
【Yonghong 企业日常问题08 】永洪BI的Apache Tomcat版本升级指南
文章目录 前言操作步骤登录验证 前言 某公司业务永洪BI系统使用tomcat 9.0.97版本,接到总公司漏洞扫描整改要求需要将tomcat版本升级到9.0.97以上。 目标:tomcat 9.0.97》 9.0.98 1、下载tomcat所需要的版本 地址:https://tomcat.apache.org/download-…...
动手学Python:从零开始构建一个“文字冒险游戏”
动手学Python:从零开始构建一个“文字冒险游戏” 大家好,我是你的技术向导。今天,我们不聊高深的框架,也不谈复杂的算法,我们来做一点“复古”又极具趣味性的事情——用Python亲手打造一个属于自己的文字冒险游戏&…...
【C/C++】C++26新特性前瞻:全面解析未来编程
展望未来:C26 新特性全面解析 随着 C 标准每三年一次的迭代节奏,C26(预计于 2026 年底正式发布)正在逐步成型。相比 C20 的革命性更新和 C23 的“修补增强”,C26 继续推进现代 C 的理念——更安全、更高效、更模块化&…...
Linux系统日志与守护进程开发实战指南
Linux系统日志与守护进程开发实战指南 系统日志与守护进程 ├── 系统日志syslog │ ├── 日志路径: /var/log/syslog │ └── 核心API │ ├── openlog │ ├── syslog │ └── closelog └── 守护进程daemon└── 创建步骤├── um…...
兰洋科技上合组织论坛发表专题分享,全球液冷布局引领绿色算力未来
2025年6月17-19日,中国—上海合作组织数字技术合作发展论坛在新疆克拉玛依市举办。作为第四次上海合作组织成员国信息通信技术发展部门负责人会议的配套会议,论坛以“数字化转型助力可持续发展,数字包容促进上合共同繁荣”为主题,…...
桌面小屏幕实战课程:DesktopScreen 11 SPI 水墨屏
飞书文档https://x509p6c8to.feishu.cn/docx/doxcnlzpIgj3gosCZufBTCZxlMb SPI说明 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上占用…...
小知识点五、无刷电机闭环控制(电流)
0 前言 该部分只用于自学使用,作为笔记方便后续自查。 资料参考:http://dengfoc.com 硬件:2208云台电机MT6701磁编码器 1 电流控制理论 1.1 待解决的问题 简单回顾一下在之前的学习中,我们通过 U q U_q Uq和电角度 θ \the…...
Java 编程之备忘录模式
前言 有时候,我们真希望人生能有“CtrlZ”。在日常生活中,我们经常使用“撤销”功能,例如在写 Word、画图、写代码时一不小心操作失误,就希望能回到之前的状态。这种**“状态快照 恢复”**机制,在设计模式中就叫做&a…...
SQL SERVER存储过程
什么是存储过程 SQL 存储过程(Stored Procedure)是一个在数据库中预编译并存储的一组 SQL 语句。它们可以包含查询、插入、更新、删除等数据库操作,甚至包括控制流语句(如条件判断、循环等)。存储过程可以通过调用来执…...
Vue样式绑定与条件渲染详
一、Vue样式绑定 在Vue中,我们可以通过多种方式动态地绑定样式,让界面根据数据状态变化而自动更新样式。 1. class样式绑定 (1) 字符串写法 适用场景:样式的类名不确定,需要动态指定 <template><div><!-- 绑定…...
python基于协同过滤的动漫推荐系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
光场操控新突破!3D 光学信息处理迎来通用 PSF 工程时代--《自然》子刊:无需复杂算法,这一技术让 3D 光学成像实现 “即拍即得”念日
导语 在光学成像领域,如何突破分辨率与成像速度的瓶颈,一直是科研人员探索的焦点。近日,加州大学洛杉矶分校(UCLA)的研究团队在《Light: Science & Applications》发表论文,提出了一种通用点扩散函数&a…...
ubuntu20.04如何给appImage创建快捷方式
ubuntu20.04如何给appImage创建快捷方式 1. 确保AppImage是可执行的 chmod x /path/to/your/appimage2. 创建.desktop文件 在~/.local/share/applications/目录下创建一个新的 .desktop 文件: vi ~/.local/share/applications/your-appname.desktop添加以下内容…...
网络安全之SQL RCE漏洞
引言 堡垒机(Bastion Host),也称为跳板机或运维安全审计系统,是一种用于管理和控制对内部网络资源访问的安全设备。它的主要作用是作为运维人员访问内部服务器和网络设备的唯一入口,通过集中化的身份认证、权限管理和…...
DeepSeek网页版随机点名器
用DeepSeek帮我们生成了一个基于html5的随机点名器,效果非常棒,如果需要加入名字,请在代码中按照对应的格式添加即可。 提示词prompt 帮我生成一个随机点名的HTML5页面 生成真实一点的名字数据 点击随机按钮开始随机选择 要有闪动的效果 &…...
Elasticsearch索引字段的类型
在 Elasticsearch 中,索引字段的类型(即 Mapping 中的字段类型)对搜索和存储性能影响很大。下面是各种常用数据类型的用途及推荐使用场景总结: 1. keyword 类型(精确匹配) 适合数据: 不需要分词…...
大模型在慢性病毒性肝炎预测及诊疗方案制定中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、慢性病毒性肝炎概述 2.1 疾病定义与分类 2.2 发病机制与病理特征 2.3 流行病学现状 三、数据收集与预处理 3.1 数据来源 3.2 数据清洗 3.3 特征工程 四、大模型选择与构建 4.1 模型选择依据 4.2 模型…...
DAY 43 复习日
浙大疏锦行https://blog.csdn.net/weixin_45655710 第一步:寻找并准备图像数据集 在Kaggle等平台上,你可以找到大量用于图像分类任务的数据集,例如英特尔图像分类数据集 (Intel Image Classification) 或手写数字识别数据集 (Digit Recogni…...
SQL学习笔记3
SQL常用函数 1、字符串函数 函数调用的语法:select 函数(参数); 常用的字符串函数有: 拼接字符串,将几个字符串拼到一起:concat (s1,s2,……); select concat(你好,hello); update mytable set wherefo concat(中…...
JVM调优实战 Day 7:JVM线程分析与死锁排查
【JVM调优实战 Day 7】JVM线程分析与死锁排查 文章标签 jvm调优, 线程分析, 死锁排查, JVM监控, Java性能优化, JVM参数配置 文章简述 在Java应用的高并发场景中,线程管理与死锁问题往往是性能瓶颈的根源。本文作为“JVM调优实战”系列的第7天,深入解析…...
Android-Layout Inspector使用手册
Layout Inspector Android Layout Inspector 是 Android Studio 中用于调试应用布局的工具 启动方法: 通过下载Layout Inspector插件,在 “View - Tool Windows - Layout Inspector” 或 “Tools - Layout Inspector” 启动。 主要界面区域:…...
【51单片机5毫秒定时器】2022-6-1
缘由单片机的代码,求大家来帮帮我-编程语言-CSDN问答 #include "REG52.h" unsigned char code smgduan[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0,64}; //共阴0~F消隐减号 unsigned char Js0, miao0;//中断…...
Flutter 多平台项目开发指南
Flutter 多平台项目开发指南 本指南将帮助你从 0 到 1 创建并适配一个支持 Android / iOS / Web / Windows / macOS / Linux 的 Flutter 多平台项目。 ✅ 一、创建支持多平台的 Flutter 项目 flutter create my_multi_platform_app cd my_multi_platform_app默认会生成支持以…...
Mac电脑如何搭建基于java后端的开发的各种工具服务
1. 确认Mac的CPU架构 首先,确认您的Mac是使用Intel还是Apple Silicon(如M1芯片)架构: uname -m如果返回x86_64,表示是Intel架构。如果返回arm64,表示是Apple Silicon架构。 2.安装IDEA Download Intelli…...
深入解析前端 Meta 标签:HTML 的隐形守护者与功能大师
在构建现代网页时,我们常常关注炫目的视觉效果、复杂的交互逻辑或强大的框架,却容易忽略那些深藏于 <head> 之中、看似不起眼的 <meta> 标签。这些标签如同网页的隐形守护者,无声地承担着定义文档元数据、指导浏览器行为、优化搜…...
CRON表达式编辑器与定时任务实现技术文档
1. 前端CRON表达式编辑器组件 CronExpressionEditor.vue组件是系统中用于创建和编辑CRON表达式的核心UI组件,它提供了直观的界面来生成复杂的定时任务表达式。 1.1 组件结构与状态管理 // 核心状态变量 const second ref<string>(0); const minute ref&…...
45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…...
《解锁AudioSet:开启音频分析的无限可能》
音频新时代的 “密钥”:AudioSet 登场 在科技飞速发展的今天,音频作为信息传播与交互的关键媒介,早已渗透到现代科技的各个角落。从智能手机中的语音助手,让我们通过简单的语音指令就能查询信息、发送消息,到智能家居系…...
环境太多?不好管理怎么办?TakMll 工具帮你快速切换和管理多语言、多版本情况下的版本切换。
本篇文章主要介绍一款环境管理工具,即TakMll,通过简单的入口命令 “tkm” 即可快速的管理多种语言下、多种版本的环境切换,诸如快速切换PHP、同时存在java、mave等不同版本。 作者:任聪聪 日期:2025年6月26日 TakMll 特…...
spring-ai 1.0.0 (1)模型调用能力
听说1.0是一个非常好用的版本,最后还是扛不住听说的压力,为了落实自己悬浮心理,自己还是着手实践一下了。 第一步pom集成: 参考spring-projects/spring-ai | DeepWiki维基以及官方文档入门 :: Spring AI …...
如何在 Manjaro Linux 上启用 AUR 仓库来安装软件包
Manjaro 是基于 Arch 的系统,是了解和学习 Arch Linux 命令的绝佳方式。它自带所有流行的桌面环境界面,无论是 XFCE 还是 Gnome 的爱好者,都可以在 Manjaro 中直接使用。 Manjaro 或 Arch Linux 的默认软件包管理器是 Pacman,我们…...
简单使用python
本文章没有深入探讨python,只说语法格式,合适于有其他编程语言的基础、并想快速使用python的人查看。 一、print() 用于打印信息,括号中可以是数学运算表达式或者字符串(或者说是文字)。 print(hello!) 1.1、转义字…...
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝 前言 蜻蜓I即时通讯系统是一款不依赖第三方服务的私有化即时通讯解决方案,本指南将详细介绍如何使用宝塔面板在CentOS系统上完成系统的完整部署。私有化部署意味着您…...
用Streamlit开发第一个Python应用程序
用Streamlit开发第一个Python应用程序 Using Streamlit to Develop the First Application in Python By JacksonML 1.Streamlit简介 Streamlit是个新出世的、功能强大的Python第三方库,将为基于Web的Python应用程序大放异彩。 Streamlit官网主页面如下&#x…...
IDEA + Spring Boot + javadoc 实例应用
1、添加 javadoc 插件 依赖 pom.xml <build><plugins><!-- javadoc 插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-javadoc-plugin</artifactId><version>3.6.3</version><…...
【机器学习深度学习】交互式线性回归 demo
目录 一、环境准备 二、Demo 功能 三、完整交互 demo 代码 3.1 执行代码 3.2 示例交互演示 3.3 运行结果 3.4 运行线性图 使用 PyTorch 构建交互式线性回归模型:输入数据、拟合直线、图像可视化并实现实时预测,助你深入理解机器学习从数据到模型的…...
新手向:Anaconda3的安装与使用方法
我们在刚开始接触Python时使用的是Python的直接编译器,如果我们需要进行其他的项目编写往往需要使用另一个版本的Python ,这样反复的下载很是麻烦并且还会造成系统变量的紊乱.这次我们引入Anaconda3,可创建虚拟的Python环境,满足不同项目的需要,当不用的时候可以直接放心删除不…...
详解零拷贝
目录 一、用户态(User Mode)和内核态(Kernel Mode) 1.1 用户态 (User Mode): 1.2 内核态 (Kernel Mode): 1.3 关键交互:系统调用 (System Call) 二、为什么需要区分用户态和内核态&#x…...
微服务常用的基础知识
1.微服务介绍 1.1 产生背景 随着互联网的发展,网站应用的规模不断扩大,传统单体架构逐渐难以应对大型网站高并发、高扩展性等需求,于是分布式系统架构应运而生。Spring Cloud 就是在这种背景下诞生的,它利用 Spring Boot 的开发便…...
【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整Python源码
🛡️【开源工具】Windows一键配置防火墙阻止策略(禁止应用联网)| 附完整源码 🌈 个人主页:创客白泽 - CSDN博客 🔥 系列专栏:🐍《Python开源项目实战》 💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。 🐋 希望大家多多支持,…...