当前位置: 首页 > news >正文

【Unity功能集】TextureShop纹理工坊(三)图层(下)

项目源码:在终章发布

索引

  • 图层
    • 渲染绘画区域
    • 图层Shader
  • 编辑器
    • 编辑模式
    • 新建图层
    • 设置当前图层
    • 上、下移动图层
    • 删除图层
    • 图层快照

图层

PS中,图层的概念贯穿始终(了解PS图层),他可以称作PS最基础也是最强大的特性之一。

那么,在TextureShop中,我们的第一个任务也即是设计并完成图层的功能。

渲染绘画区域

接上篇,为了实现渲染绘画区域的逻辑,我们添加一个控制变量:

    /// <summary>/// 图层/// </summary>public sealed class TextureLayer{//图层是否为脏的,将触发重新生成渲染源private bool _isTextureDirty = false;}

然后,在帧轮询方法OnUpdate中,检测并重新生成渲染源:

    /// <summary>/// 图层/// </summary>public sealed class TextureLayer{/// <summary>/// 图层更新/// </summary>public void OnUpdate(){//当图层改变时(被标记为脏的)if (_isTextureDirty){_isTextureDirty = false;for (int x = 0; x < _texture.width; x++){for (int y = 0; y < _texture.height; y++){//通过偏移值(锚点),从绘画板中提取颜色,填充到_texture(渲染源)中Color bColor = _plate.GetColor(x + Offset.x, y + Offset.y);_texture.SetPixel(x, y, bColor);}}_texture.Apply();}}}

_isTextureDirty变量的控制至关重要,它使得即便在同一帧多次改变了图层数据,也仅仅只会进行一次生成渲染源,而不是图层每改变一次便触发一次生成渲染源,那将带来极大的性能开销。

图层Shader

再者是图层持有的Shader TextureLayer.shader,在TextureLayer类的构造方法中,他已将渲染源设置给了Shader:

 _material.SetTexture("_PaintTex", _texture);

那么在TextureLayer.shader中将是我们自行编写的渲染逻辑,只不过此时我们没有额外的处理,直接原封不动的输出了渲染源中的颜色:

Shader "Hidden/TextureShop/TextureLayer"
{Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) = "white" {}[HideInInspector] _PaintTex("图层纹理", 2D) = "white" {}}SubShader{Tags{"Queue" = "Transparent""IgnoreProjector" = "True""RenderType" = "Transparent""PreviewType" = "Plane""CanUseSpriteAtlas" = "True"}Cull OffLighting OffZWrite OffZTest[unity_GUIZTestMode]Blend SrcAlpha OneMinusSrcAlphaPass{Name "Default"CGPROGRAM#pragma vertex vert#pragma fragment frag#pragma target 2.0#include "UnityCG.cginc"#include "UnityUI.cginc"struct VertData{float4 vertex   : POSITION;fixed4 color : COLOR;float2 texcoord : TEXCOORD0;UNITY_VERTEX_INPUT_INSTANCE_ID};struct FragData{float4 vertex   : SV_POSITION;fixed4 color : COLOR;float2 texcoord  : TEXCOORD0;float4 worldPosition : TEXCOORD1;UNITY_VERTEX_OUTPUT_STEREO};sampler2D _PaintTex;FragData vert(VertData IN){FragData OUT;UNITY_SETUP_INSTANCE_ID(IN);UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);OUT.worldPosition = IN.vertex;OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);OUT.texcoord = IN.texcoord;OUT.color = IN.color;return OUT;}fixed4 frag(FragData IN) : SV_Target{//原封不动输出颜色half4 color = tex2D(_PaintTex, IN.texcoord);return color;}ENDCG}}
}

编辑器

我们需要定义一个最顶层的控制器类,也将作为我们整个程序的入口,TextureShop的编辑器:

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{}

回顾图层的尺寸等参数,所有的图层应当拥有一样的尺寸大小,所以将他们加入到编辑器中,以公开到外部设置:

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 绘画区域宽度/// </summary>public int PaintAreaWidth = 512;/// <summary>/// 绘画区域高度/// </summary>public int PaintAreaHeight = 512;/// <summary>/// 绘画板宽度/// </summary>public int PlateWidth = 2048;/// <summary>/// 绘画板高度/// </summary>public int PlateHeight = 2048;}

编辑模式

编辑模式目前暂定为如下几种:

编辑模式描述
不可进行任何编辑操作
移动选中选区时,移动选区内容,否则移动绘画板内容
选取以矩形方式选择选区
套索以套索方式选择选区
魔术棒以魔术棒方式选择选区
修剪进行高自由度修剪选区
仿制图章按住Alt锚定一片区域,然后在其他地方可复制该区域
画笔使用鼠标进行绘画
橡皮擦使用鼠标进行擦除
    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 编辑模式/// </summary>[SerializeField] private EditMode _mode = EditMode.None;}/// <summary>/// 编辑模式/// </summary>public enum EditMode{/// <summary>/// 无/// </summary>None,/// <summary>/// 移动/// </summary>Move,/// <summary>/// 选取/// </summary>Choose,/// <summary>/// 套索/// </summary>Noose,/// <summary>/// 魔术棒/// </summary>MagicWand,/// <summary>/// 修剪/// </summary>Trim,/// <summary>/// 仿制图章/// </summary>CloneStamp,/// <summary>/// 画笔/// </summary>Paint,/// <summary>/// 擦除/// </summary>Erase}

新建图层

新建图层时,传入尺寸、图像数据等参数(如果传入了图像,将该图像颜色数据载入新建的图层中,否则新建一个空图层):

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{//图层渲染器放置的根节点private RectTransform _textureLayerRoot;/// <summary>/// 所有的图层/// </summary>public List<TextureLayer> TextureLayers { get; private set; } = new List<TextureLayer>();/// <summary>/// 新建一个图层/// </summary>/// <param name="layerName">图层名称</param>/// <param name="texture">图层图像</param>/// <param name="offset">偏移值</param>/// <returns>图层</returns>public TextureLayer NewTextureLayer(string layerName, Texture2D texture, Vector2Int offset = default){layerName = string.IsNullOrEmpty(layerName) ? "新建图层" : layerName;TextureLayer textureLayer = new TextureLayer(layerName, PaintAreaWidth, PaintAreaHeight, PlateWidth, PlateHeight, _textureLayerRoot, texture, offset);TextureLayers.Add(textureLayer);return textureLayer;}}

设置当前图层

只有当前图层不为空,才能进一步编辑当前图层:

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 当前选中的图层/// </summary>public TextureLayer CurrentLayer { get; private set; }/// <summary>/// 设置当前激活的图层/// </summary>/// <param name="layer">图层</param>public void SetCurrentLayer(TextureLayer layer){if (CurrentLayer == layer)return;CurrentLayer = layer;}}

上、下移动图层

图层越靠下(在图层列表中越靠后),其显示层级越高,也即是能在视觉上挡住之前的图层:

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 向上移动当前图层(显示层级降低)/// </summary>public void MoveLayerUpwards(){if (CurrentLayer != null){int index = TextureLayers.IndexOf(CurrentLayer);if (index > 0){index -= 1;TextureLayers.Remove(CurrentLayer);TextureLayers.Insert(index, CurrentLayer);//移动图层渲染器实体,改变其在父级中的位置CurrentLayer.Entity.transform.SetSiblingIndex(index);}}}/// <summary>/// 向下移动当前图层(显示层级升高)/// </summary>public void MoveLayerDownwards(){if (CurrentLayer != null){int index = TextureLayers.IndexOf(CurrentLayer);if (index < TextureLayers.Count - 1){index += 1;TextureLayers.Remove(CurrentLayer);TextureLayers.Insert(index, CurrentLayer);CurrentLayer.Entity.transform.SetSiblingIndex(index);}}}}

删除图层

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 删除一个图层/// </summary>/// <param name="layer">图层</param>public void DeleteTextureLayer(TextureLayer layer){if (layer == null)return;if (CurrentLayer == layer){SetCurrentLayer(null);}layer.Dispose();TextureLayers.Remove(layer);}}

图层快照

在进行某些操作时,如果用户未点击确认,而是点击了取消,则之前的操作将被还原,如下:

在这里插入图片描述

为了实现这个功能,我们引入图层快照(当然,更高级的应当引入命令模式,但这不在本系列的学习范畴内):

    /// <summary>/// 图层快照/// </summary>public sealed class TextureLayerSnapshot{internal Plate _plate;internal Plate _region;internal Vector2Int _offset;/// <summary>/// 图层快照/// </summary>public TextureLayerSnapshot(int paintAreaWidth, int paintAreaHeight, int plateWidth, int plateHeight){_plate = new Plate(plateWidth, plateHeight, true);_region = new Plate(paintAreaWidth, paintAreaHeight, false);_offset = new Vector2Int((_plate.Width - _region.Width) / 2, (_plate.Height - _region.Height) / 2);}/// <summary>/// 释放图层快照资源/// </summary>public void Dispose(){if (_plate != null){_plate.Dispose();_plate = null;}if (_region != null){_region.Dispose();_region = null;}}}

任何图层,都可以为其创建快照,并在之后的某一时刻还原到快照,快照能够记录一个图层在某一时刻的完整状态:

    /// <summary>/// TextureShop编辑器/// </summary>[DisallowMultipleComponent]public sealed class TextureShopEditor : MonoBehaviour{/// <summary>/// 当前的图层快照/// </summary>public TextureLayerSnapshot CurrentSnapshot { get; private set; }/// <summary>/// 为当前图层创建快照/// </summary>public void CreateLayerSnapshot(){if (CurrentLayer != null){CurrentLayer.OutputToSnapshot(CurrentSnapshot);}}/// <summary>/// 将当前图层还原到快照/// </summary>public void RestoreLayerSnapshot(){if (CurrentLayer != null){CurrentLayer.InputOfSnapshot(CurrentSnapshot);}}}

至于图层如何创建快照,如何还原到快照,将由他自己定夺:

    /// <summary>/// 图层/// </summary>public sealed class TextureLayer{/// <summary>/// 输出到快照/// </summary>/// <param name="snapshot">快照</param>internal void OutputToSnapshot(TextureLayerSnapshot snapshot){_plate.CopyTo(snapshot._plate);_region.CopyTo(snapshot._region);snapshot._offset = Offset;}/// <summary>/// 通过快照输入/// </summary>/// <param name="snapshot">快照</param>internal void InputOfSnapshot(TextureLayerSnapshot snapshot){snapshot._plate.CopyTo(_plate);snapshot._region.CopyTo(_region);Offset = snapshot._offset;//图层为脏的,触发重新生成渲染源_isTextureDirty = true;}}

到此,图层的功能就实现得差不多了。

相关文章:

【Unity功能集】TextureShop纹理工坊(三)图层(下)

项目源码&#xff1a;在终章发布 索引 图层渲染绘画区域图层Shader 编辑器编辑模式新建图层设置当前图层上、下移动图层删除图层图层快照 图层 在PS中&#xff0c;图层的概念贯穿始终&#xff08;了解PS图层&#xff09;&#xff0c;他可以称作PS最基础也是最强大的特性之一。…...

基于 SSM 框架 Vue 电脑测评系统:引领电脑评测新方向

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…...

Android笔记【19】

具体示例 run: val result someObject.run {// 这里可以使用 thisthis.someMethod() }let: val result someObject?.let {// 这里使用 itit.someMethod() }with: val result with(someObject) {// 这里使用 thissomeMethod() }apply: val obj SomeClass().apply {// 这里使…...

Redis 中 IntSet 底层数据结构

IntSet 底层数据结构 序言: 像字符串 SDS 只是保存了一个变量的值&#xff0c;但是像 Redis 中也是需要保存一些集合元素的&#xff0c;这里就介绍一下其中一种集合 IntSet&#xff0c;由于是 Set 所以也有 Set 的一些特性&#xff0c;不过也多加了一些特性&#xff1a; ● 唯…...

自然语言处理:我的学习心得与笔记

Pytorch 1.Pytorch基本语法 1.1 认识Pytorch 1.2 Pytorch中的autograd 2.Pytorch初步应用 2.1 使用Pytorch构建一个神经网络 2.2 使用Pytorch构建一个分类器 小节总结 学习了什么是Pytorch. 。Pytorch是一个基于Numpy的科学计算包,作为Numpy的替代者,向用户提供使用GPU强大…...

Altair: 轻松创建交互式数据可视化

Altair: 轻松创建交互式数据可视化 Altair 是一个基于 Vega-Lite 的 Python 数据可视化库&#xff0c;它旨在简化数据可视化的创建过程&#xff0c;尤其适用于统计图表的生成。Altair 强调声明式编码方式&#xff0c;通过简单的语法&#xff0c;用户能够快速创建复杂的交互式图…...

【NLP】序列到序列(seq2seq)建模工具fairseq使用详解

文章目录 一、fairseq简介二、安装方式2.1 pip安装2.2 源码安装 三、fairseq命令工具3.1 fairseq-preprocess3.2 fairseq-train3.3 fairseq-generate3.4 fairseq-interactivate3.5 fairseq-score3.6 fairseq-eval-lm 4. 常见报错报错1 参考资料 一、fairseq简介 fairseq 是 Fa…...

[极客大挑战 2019]HardSQL 1

[极客大挑战 2019]HardSQL 1 打开实例&#xff0c;发现是个登陆页面&#xff0c;查看源代码&#xff0c;发现又是GET提交check.php 万能密码尝试 不太行&#xff0c;怀疑字段或者空格被过滤&#xff0c;尝试闭合不加其他东西 确认空格、union、and等都被过滤了&#xff0c;尝试…...

天空分割代码

目录 依赖项: 分割源代码: 依赖项: groundingdino Grounded-Segment-Anything 分割源代码: generate_sky_mask.py import os, syssys.path.append(os.getcwd()) # Change to your folder here sys.path.append(Grounded-Segment-Anything)import argparse import os…...

Leetcode 三角形最小路径和

算法思想与代码详解 这段代码采用的是**动态规划&#xff08;Dynamic Programming&#xff09;**的思想&#xff0c;用来解决“120. 三角形最小路径和”问题。动态规划通过将问题分解成更小的子问题&#xff0c;并通过保存子问题的解来避免重复计算&#xff0c;从而提高效率。…...

[Unity]Unity跨平台开发之Android入门

安卓环境配置 安装依赖项 推荐使用Unity Hub进行安装&#xff0c;安装时勾选Android Build Support、Android SDK & NDK Tools、OpenJDK。或者指定已安装的依赖项。&#xff08;注意&#xff1a;指定的依赖项需要是从UnityHub安装的。比如之前安装Unity2022时勾选了上述依…...

搭建Flume

title: 搭建Flume date: 2024-11-30 23:59:00 categories: - 服务器 tags: - Flume - 大数据搭建Flume 本次实验环境&#xff1a;Centos 7-2009、JDK 8、Flume-1.11.0 开始安装 1. 下载安装文件到服务器 # 使用wget命令下载flume文件&#xff08;二选一&#xff09; wget …...

【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用

文章目录 一、while 循环1、语法&#xff1a;2、示例&#xff1a; 二、 do-while 循环1、语法&#xff1a;2、示例&#xff1a; 三、for 循环1、语法&#xff1a;2、示例&#xff1a; 四、foreach 循环1、语法&#xff1a;2、示例&#xff1a; 五、总结对比六、注意事项七、使用…...

flask flask-socketio创建一个网页聊天应用

应用所需环境&#xff1a; python 3.11.11 其他 只需要通过这个命令即可 pip install flask3.1.0 Flask-SocketIO5.4.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple 最好是用conda创建一个新的虚拟环境来验证 完整的pip list如下 Package Version ----…...

MVCC了解

MVCC&#xff08;多版本并发控制&#xff09;学习指南及代码示例 一、学习MVCC前先了解什么 1. MVCC的定义和作用 MVCC是一种并发控制机制&#xff0c;用于解决并发事务访问数据库时可能出现的问题&#xff0c;如脏读、不可重复读和幻读。它通过为每个数据行维护多个版本来实…...

LabVIEW随机扫描成像系统

利用LabVIEW开发了一套随机扫描成像系统&#xff0c;利用硬件时钟实现声光偏转器&#xff08;AOD&#xff09;的频率控制与信号采集之间的高速时间同步。系统利用了高精度的时钟同步技术&#xff0c;确保了成像精度和重复性&#xff0c;从而有效提高了成像速度和质量。 项目背景…...

系统移植——Linux 内核顶层 Makefile 详解

一、概述 Linux Kernel网上下载的版本很多NXP等有自己对应的版本。需要从网上直接下载就可以。 二、Linux内核初次编译 编译内核之前需要先在 ubuntu 上安装 lzop 库 sudo apt-get install lzop 在 Ubuntu 中 新 建 名 为 “ alientek_linux ” 的 文 件夹 &#xff0c; …...

【一文了解】C#重点-委托1

本篇文章来学习一下C#的委托&#xff0c;委托是C#中的一个重要概念&#xff0c;它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C中的函数指针&#xff0c;并且类型安全。 委托 1.委托的定义 委托&#xff08;delegate&#xff09;是方法的代理/代表&#xff0c;委托…...

LeetCode hot100-87

https://leetcode.cn/problems/longest-increasing-subsequence/?envTypestudy-plan-v2&envIdtop-100-liked 300. 最长递增子序列 已解答 中等 相关标签 相关企业 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列&a…...

项目26:简易在线论坛 --- 《跟着小王学Python·新手》

项目26&#xff1a;简易在线论坛 — 《跟着小王学Python新手》 《跟着小王学Python》 是一套精心设计的Python学习教程&#xff0c;适合各个层次的学习者。本教程从基础语法入手&#xff0c;逐步深入到高级应用&#xff0c;以实例驱动的方式&#xff0c;帮助学习者逐步掌握Pyth…...

知乎 PB 级别 TiDB 数据库集群管控实践

以下文章来源于知乎技术专栏 &#xff0c;作者代晓磊 导读 在现代企业中&#xff0c;数据库的运维管理至关重要&#xff0c;特别是面对分布式数据库的复杂性和大规模集群的挑战。作为一款兼容 MySQL 协议的分布式关系型数据库&#xff0c;TiDB 在高可用、高扩展性和强一致性方…...

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址&#xff1a;https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64&#xff0c;一直下一步&#xff0c;选择安装的路径位置&#xff0c;一直下一步就安装完成了。打开Anaconda PowerShell Promp…...

RK3588 , mpp硬编码rgb, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ RK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBUbuntu x64 架构, 交叉编译aarch64 FFmpeg mppCode Init MppMPP_RET init_mpp...

揭开 Choerodon UI 拖拽功能的神秘面纱

01 引言 系统的交互方式主要由点击、选择等组成。为了提升 HZERO 系统的用户体验、减少部分操作步骤&#xff0c;组件库集成了卓越的拖拽功能&#xff0c;让用户可以更高效流畅的操作系统。 例如&#xff1a;表格支持多行拖拽排序、跨表数据调整、个性化调整列顺序&#xff1…...

常用网络协议简述

网络协议是计算机网络中规定数据交换格式和交换规则的一套标准。以下是一些常用的网络协议及其简要解释&#xff1a; HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09; 用于从网络传输超文本数据到本地浏览器的传输协议。基于TCP协议&…...

本地电脑使用命令行上传文件至远程服务器

将本地文件上传到远程服务器&#xff0c;在本地电脑中cmd使用该命令&#xff1a; scp C:/Users/"你的用户名"/Desktop/environment.yml ws:~/environment.yml 其中&#xff0c;C:/Users/“你的用户名”/Desktop/environment.yml是本地文件的路径&#xff0c; ~/en…...

笔记day2

文章目录 1 NavigationDuplivated警告错误2 Home模块组件拆分3 三级联动组件完成4 完成其余静态组件5 POSTMAN测试接口6 axios二次封装6.1 为什么需要进行二次封装axios&#xff1f;6.2 在项目中经常API文件夹【axios】6.3 axios基础不好&#xff0c;可以参考git|NPM关于axios文…...

排序算法(3)——归并排序、计数排序

目录 1. 归并排序 1.1 递归实现 1.2 非递归实现 1.3 归并排序特性总结 2. 计数排序 代码实现 3. 总结 1. 归并排序 基本思想&#xff1a; 归并排序&#xff08;merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff0…...

【5】C#期末复习第5套

1.int a[3][2]{2,4,6,8,10.12};则*&#xff08;a[1]1&#xff09;的值是8 指向&#xff08;a[1]的第二个元素&#xff09; 再* 2.合并字符串库函数strcat 3.比较字符串库函数strcmp 4.执行结果是x3&#xff0c;y3 int x3,y; int *px&x; y*px; (优先级高于*) 5.*p[5]没…...

jquery虚拟键盘插件jqkeyboard

jqKeyboard是一款jquery虚拟键盘插件。该虚拟键盘插件依赖于jquery ui&#xff0c;通过该插件&#xff0c;可以在页面中生成一个扁平风格的虚拟键盘面板。 在线预览 下载 安装 可以通过npm来安装jqKeyboard虚拟键盘插件。 npm install jq keyboard --save 使用方法 在页面…...

IMX6ULL开发板把屏幕刷黑(黑屏)的程序

承接博文 IMX6ULL开发板基础实验:Framebuffer驱动程序的简单应用实例代码详细分析 很容易写出把屏幕刷黑的程序… Ubuntu中的目录/home/book/mycode下新建目录C0003_draw_lcd_black&#xff0c;然后把把博文中的源码/home/book/mycode/C0002_show_pixel复制到目录C0003_draw_l…...

OpenCV基本图像处理操作(三)——图像轮廓

轮廓 cv2.findContours(img,mode,method) mode:轮廓检索模式 RETR_EXTERNAL &#xff1a;只检索最外面的轮廓&#xff1b;RETR_LIST&#xff1a;检索所有的轮廓&#xff0c;并将其保存到一条链表当中&#xff1b;RETR_CCOMP&#xff1a;检索所有的轮廓&#xff0c;并将他们组…...

C语言学习day24:DLL给程序打上窗口破解补丁

简言 在上一章节我们知道了DLL&#xff0c;编写DLL以及最重要的导出DLL&#xff0c;这一章节我们学习如何给应用打上窗口破解补丁&#xff08;DLL&#xff09;。 流程 工具&#xff1a;studyPE 操作&#xff1a; 把要补丁的程序拖入PE中点击导入菜单&#xff0c;导入dll函…...

大模型呼出机器人的应用场景

大模型呼出机器人的应用场景 原作者&#xff1a;开源呼叫中心FreeIPCC&#xff0c;其Github&#xff1a;https://github.com/lihaiya/freeipcc 大模型呼出机器人的应用场景十分广泛&#xff0c;涵盖了多个行业和服务领域。以下是对其应用场景的详细归纳&#xff1a; 一、客户…...

el-date-picker筛选时间日期选择范围

el-date-picker 选择时间日期范围-> 昨天 近7天 30天<template><div class"main"><div class"header"><el-form :model"form" label-width"auto"><el-button plain click"setTimeToYesterday&q…...

【Apache Paimon】-- 10 -- Paimon 0.9.0 集成 Hive 3.1.3

参考官方 0.9.0 版本文档:https://paimon.apache.org/docs/0.9/engines/hive/ 1、下载依赖包到 hive lib 下 $ cd $HIVE_HOME/$ mkdir auxlib$ cd auxlib$ wget https://repo.maven.apache.org/maven2/org/apache/paimon/paimon-hive-connector-3.1/0.9.0/paimon-hive-connec…...

vue2如何写一个轮播图

需求描述 写一个轮播图&#xff0c;可以实现如下效果&#xff1a; 页面上展示三个轮播图元素默认状态下&#xff0c;进行自动轮播&#xff0c;循环播放一旦鼠标移入轮播图范围内&#xff0c;并停留在元素a上&#xff0c;则轮播图停止自动播放&#xff0c;同时将元素a放大 核…...

基础库httpx的使用

urllib 库和 requests 库的使用&#xff0c;已经可以爬取绝大多数网站的数据&#xff0c;但对于某些网站依然无能为力。什么情况?这些网站强制使用HTTP/2.0协议访问&#xff0c;这时 urllib 和requests 是无法爬取数据的&#xff0c;因为它们只支持 HTTP/1.1&#xff0c;不支持…...

MYSQL 利用concat函数 生成更新或者插入SQL

有时候需要批量运维一批数据&#xff0c;一条一条写SQL比较麻烦&#xff0c;可以使用下面的方法批量生成select sales_order_number,a.sog_line_id,actual_price,sales_goods_unit_price,b.id,concat(update your_table set actual_price, sales_goods_unit_price, where id,b…...

Backend For Frontend的学习分享

晚上公司开了一个技术分享会&#xff0c;主要内容就是公司的项目架构&#xff0c;会中讲解了项目整体架构是BFF架构&#xff0c;就是在微服务之上多加了一层。 除此之外&#xff0c;还讲解了DDD设计思想&#xff0c;主要用于各个业务中台&#xff0c;如订单中台、用户中台等。…...

KS曲线python实现

目录 实战 实战 # 导入第三方模块 import pandas as pd import numpy as np import matplotlib.pyplot as plt# 自定义绘制ks曲线的函数 def plot_ks(y_test, y_score, positive_flag):# 对y_test重新设置索引y_test.index np.arange(len(y_test))# 构建目标数据集target_dat…...

【GO环境安装】mac系统+GoLand使用

文章目录 下载安装包环境配置GoLandGo Modules 下载安装包 地址&#xff1a;GO下载地址 下载好后直接进行安装&#xff1a; 进入terminal&#xff0c;查看是否安装成功&#xff1a; 环境配置 在文稿下面创建工作目录&#xff1a; 在文稿下新建Go_Works文件夹&#xff0c;在…...

2025年入职/转行网络安全,该如何规划?网络安全职业规划

网络安全是一个日益增长的行业&#xff0c;对于打算进入或转行进入该领域的人来说&#xff0c;制定一个清晰且系统的职业规划非常重要。2025年&#xff0c;网络安全领域将继续发展并面临新的挑战&#xff0c;包括不断变化的技术、法规要求以及日益复杂的威胁环境。以下是一个关…...

linux中 umask 命令

Umask Umask&#xff08;User File Creation Mode Mask&#xff09;是Linux系统中的一项命令&#xff0c;用于设定新创建文件和目录的默认权限。 一、umask的作用 Umask通过掩码操作&#xff0c;限制新文件和目录的访问权限。在Linux中&#xff0c;所有的文件和目录都被分配…...

OpenCV函数及其应用

1. 梯度处理的Sobel算子函数 功能 Sobel算子是一种用于边缘检测的离散微分算子&#xff0c;它结合了高斯平滑和微分求导&#xff0c;用于计算图像亮度的空间梯度。 参数 src&#xff1a;输入图像。 dst&#xff1a;输出图像。 ddepth&#xff1a;输出图像的深度。 dx&#xff…...

使用ENSP实现NAT(2)

一、NAT的类型 二、静态NAT 1.项目拓扑 2.项目实现 路由器AR1配置&#xff1a; 进入系统视图 sys将路由器命名为AR1 sysname AR1关闭信息中心 undo info-center enable 进入g0/0/0接口 int g0/0/0将g0/0/0接口IP地址配置为192.168.10.254/24 ip address 192.168.10.254 24进…...

欢迎 PaliGemma 2 – 来自 Google 的新视觉语言模型

我们很高兴迎来 Google 全新的视觉语言模型 PaliGemma 2&#xff0c;这是 PaliGemma 的一个新版本。与其前代产品一样&#xff0c;PaliGemma 2 使用强大的SigLIP进行视觉处理&#xff0c;但在文本解码部分升级到了最新的 Gemma 2。 https://hf.co/collections/google/siglip-65…...

C++ List(双向链表)

是一个线性链表结构&#xff0c;它的数据由若干个节点构成&#xff0c;每一个节点都包括一个 信息块&#xff08;即实际存储的数据&#xff09;、一个前驱指针和一个后驱指针。它无需分配指定 的内存大小且可以任意伸缩&#xff0c;这是因为它存储在非连续的内存空间中&#…...

pip使用方法

1. 安装包&#xff1a; pip install &#xff1a;安装指定的 Python 包。 pip install &#xff1a;安装特定版本的 Python 包。 pip install -r requirements.txt&#xff1a;从文件中读取依赖列表并安装所有列出的包。 pip install --pre &#xff1a;允许安装预发布或开发版…...

websocket再项目中的使用

WebSocket在项目中的使用‌主要包括以下几个方面&#xff1a; ‌WebSocket的基本概念和原理‌&#xff1a; ‌定义‌&#xff1a;WebSocket是一种基于TCP的协议&#xff0c;实现了浏览器与服务器之间的全双工通信。它通过HTTP/1.1协议的101状态码进行握手&#xff0c;建立连接‌…...