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

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录

  • SKCanvas方法
    • DrawUrlAnnotation 绘制URL注释
    • DrawVertices 按顶点绘制
    • Flush 立即绘制
    • QuickReject 判断区域是否在裁切区域之外
    • ResetMatrix重置矩阵
    • Restore、RestoreToCount
    • RotateDegrees按角度旋转画布
    • RotateRadians按弧度旋转画布
    • SaveLayer保存并新建图层
    • Scale 缩放画布
    • SetMatrix 设置矩阵
    • Skew 倾斜
    • Translate 平移

SKCanvas方法

DrawUrlAnnotation 绘制URL注释

public void DrawUrlAnnotation (SkiaSharp.SKRect rect, SkiaSharp.SKData value);
public SkiaSharp.SKData DrawUrlAnnotation (SkiaSharp.SKRect rect, string value);

创建一个矩形区域为为可点击的URL注释。(在不支持的后端,此语句将被忽略)

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var stream = File.OpenWrite(@"Images\test.pdf"))
using (var doc = SKDocument.CreatePdf(stream, 72))
using (var pdfCanvas = doc.BeginPage(600, 600))
using (var paint = new SKPaint())
{paint.TextSize = 18;paint.Color = SKColors.LightGreen;paint.IsStroke = true;var text = $"https://www.csdn.net/";pdfCanvas.DrawText(text, 20, 200, paint);var bbox = new SKRect();paint.MeasureText(text, ref bbox);pdfCanvas.Translate(20, 200);pdfCanvas.DrawRect(bbox,paint);pdfCanvas.DrawUrlAnnotation(bbox, text);doc.EndPage();doc.Close();
}
  1. 绘制文本网址
  2. 测量文本的区域
  3. 绘制区域矩形,并生成URL注释
    DrawUrlAnnotation

DrawVertices 按顶点绘制

public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKPoint[] texs, SkiaSharp.SKColor[] colors, ushort[] indices, SkiaSharp.SKPaint paint);
public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKPoint[] texs, SkiaSharp.SKColor[] colors, SkiaSharp.SKBlendMode mode, ushort[] indices, SkiaSharp.SKPaint paint);
public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKPoint[] texs, SkiaSharp.SKColor[] colors, SkiaSharp.SKPaint paint);
public void DrawVertices (SkiaSharp.SKVertexMode vmode, SkiaSharp.SKPoint[] vertices, SkiaSharp.SKColor[] colors, SkiaSharp.SKPaint paint);

通过顶点来定义几何形状,可以控制每个顶点的颜色和纹理坐标。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);// 定义顶点位置
var vertices = new SKPoint[]
{new SKPoint(100, 100),new SKPoint(200, 80),new SKPoint(150, 200),new SKPoint(300, 100),new SKPoint(400, 60),new SKPoint(350, 200)
};// 定义每个顶点的颜色
var colors = new SKColor[]
{new SKColor(255,0,0,128),new SKColor(255,255,0,128),new SKColor(255,255,255,128),new SKColor(0,255,0,128),new SKColor(0,255,255,128),new SKColor(0,0,255,128)
};// 创建 SKPaint 对象
using (var paint = new SKPaint())
{var modes=Enum.GetValues(typeof(SKVertexMode)) as SKVertexMode[];paint.TextSize = 18;paint.IsAntialias = true;foreach (var per  in modes){paint.StrokeWidth = 1;canvas.DrawVertices(per, vertices, colors, paint);canvas.DrawText($"SKVertexMode:{per}", 450, 150, paint);paint.StrokeWidth = 5;paint.StrokeCap = SKStrokeCap.Round;canvas.DrawPoints(SKPointMode.Points, vertices, paint);for(int i = 0; i < vertices.Length; i++){var pt=vertices[i];canvas.DrawText($"{i}", pt, paint);}canvas.Translate(0, 200);}
}

定义6个顶点、6个颜色,分别用三种方式绘制。
DrawVertices

  1. Triangles: 将每三个顶点作为一个独立的三角形来绘制。
  2. TriangleStrip: 将顶点组合作为一个三角形条带绘制,每相邻的三个顶点组成一个三角形。
  3. TriangleFan: 将顶点组合作为一个三角形扇绘制,第一个顶点作为扇的中心点,后续顶点与这个中心点以及前一个顶点一起构成一个三角形。

Flush 立即绘制

public void Flush ();

用于将所有挂起的绘制命令立即提交到目标设备。

  1. 确保绘制完成:在复杂的绘制操作之后调用 Flush 可以确保所有操作都已提交并完成。
  2. 减少延迟:在需要即时反馈或减少绘制延迟的情况下,调用 Flush 可以让绘制结果立即生效。
  3. 同步绘制:在与其他绘制或图形系统交互时,Flush 可以确保 SkiaSharp 的绘制操作已完成,以便其他系统可以访问最新的绘制结果。

QuickReject 判断区域是否在裁切区域之外

public bool QuickReject (SkiaSharp.SKPath path);
public bool QuickReject (SkiaSharp.SKRect rect);

快速判断指定的路径或矩形,在当前矩阵变换后是否完全位于当前裁切区域之外。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{var rectA = new SKRect(50, 50, 250, 150);var rectB = new SKRect(450, 50, 650, 150);paint.IsStroke = true;paint.StrokeWidth = 10;if (!canvas.QuickReject(rectA)){canvas.DrawRect(rectA, paint);}if (!canvas.QuickReject(rectB)){canvas.DrawRect(rectB, paint);}canvas.ClipRect(new SKRect(400, 0, 800, 800));   paint.StrokeWidth = 1;paint.Color = SKColors.Red;if (!canvas.QuickReject(rectA)){canvas.DrawRect(rectA, paint);}if (!canvas.QuickReject(rectB)){canvas.DrawRect(rectB, paint);}
}

1.定义两个矩形,判断是否在裁切区域之外,可能在区域之内,则绘制
2.重新定义裁切区域,判断原来的两个矩形是否在裁切区域之外,绘制在裁切区域之内的矩形。
QuickReject

ResetMatrix重置矩阵

public void ResetMatrix ();

重置矩阵。

Restore、RestoreToCount

public void Restore ();
public void RestoreToCount (int count);

恢复画布到上一或指定状态。
示例见下图。

RotateDegrees按角度旋转画布

public void RotateDegrees (float degrees);
public void RotateDegrees (float degrees, float px, float py);

绕原点或指定点旋转一个角度(正:顺时针,负:逆时针)

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{var index = 1;paint.TextSize = 18;paint.Color = SKColors.Red;paint.IsAntialias = true;paint.IsStroke = true;var dstX = 300;var dstY = 100;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} Before RotateDegrees", dstX, dstY, paint);canvas.Save();paint.Color = SKColors.Blue;canvas.RotateDegrees(30);index++;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} After RotateDegrees(30)", dstX, dstY, paint);canvas.Restore();paint.Color = SKColors.Red;var centerPt = new SKPoint(300, 400);var rect = new SKRect(centerPt.X - 100, centerPt.Y - 50, centerPt.X + 100, centerPt.Y + 50);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} Before RotateDegrees", centerPt,paint);var saveCount = canvas.SaveCount;canvas.Save();paint.Color = SKColors.Blue;canvas.RotateDegrees(-30, centerPt.X, centerPt.Y);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} Before RotateDegrees(-30,{centerPt.X},{centerPt.Y})", centerPt, paint);index++;canvas.DrawText($"{index} SaveCount:{canvas.SaveCount}", 400, 500, paint);canvas.RestoreToCount(saveCount);paint.Color = SKColors.Red;index++;canvas.DrawText($"{index} SaveCount:{canvas.SaveCount}", 400, 500, paint);
}

1.从原点画一条线段
2.旋转画布后,再画一条相同的线段
3.恢复画布状态
4.在指定点绘制一个矩形
5.画布线指定点旋转后,再绘制一个矩形
RotateDegrees

RotateRadians按弧度旋转画布

public void RotateRadians (float radians, float px, float py);
public void RotateRadians (float radians);

绕原点或指定,按弧度旋转。(是不是有点多余了,弧度和角度提供一个就可以了吧?)

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{var index = 1;paint.TextSize = 18;paint.Color = SKColors.Red;paint.IsAntialias = true;paint.IsStroke = true;var dstX = 300;var dstY = 100;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} Before RotateRadians", dstX, dstY, paint);canvas.Save();paint.Color = SKColors.Blue;canvas.RotateRadians((float)(Math.PI/6));index++;canvas.DrawLine(0, 0, dstX, dstY, paint);canvas.DrawText($"{index} After RotateRadians(Math.PI/6)", dstX, dstY, paint);canvas.Restore();paint.Color = SKColors.Red;var centerPt = new SKPoint(300, 400);var rect = new SKRect(centerPt.X - 100, centerPt.Y - 50, centerPt.X + 100, centerPt.Y + 50);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} Before RotateRadians", centerPt, paint);var saveCount = canvas.SaveCount;canvas.Save();paint.Color = SKColors.Blue;canvas.RotateRadians(-(float)(Math.PI / 6), centerPt.X, centerPt.Y);canvas.DrawRect(rect, paint);index++;canvas.DrawText($"Rect{index} After RotateRadians(-(Math.PI / 6),{centerPt.X},{centerPt.Y})", centerPt, paint);
}

RotateRadians

SaveLayer保存并新建图层

public int SaveLayer ();
public int SaveLayer (SkiaSharp.SKPaint paint);
public int SaveLayer (SkiaSharp.SKRect limit, SkiaSharp.SKPaint paint);

用于将当前的绘图状态保存到栈中,并创建一个新的图层(layer)。在新的图层上进行的所有绘制操作都会被暂时保存在这个图层上,而不是直接绘制在画布上。

  1. 临时绘制:在图层上进行临时绘制操作,然后再将图层合并回主画布。这对于需要多次更新和合成的复杂绘制操作非常有用。
  2. 混合模式:使用特定的混合模式或透明度进行绘制。图层上的所有绘制操作都可以以特定的混合模式或透明度应用到主画布上。
  3. 效果应用:在图层上应用滤镜或效果,然后将图层合并回主画布。这样可以避免在主画布上直接应用效果,保留原始绘图的灵活性。
var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{paint.Color = SKColors.Red.WithAlpha(128);canvas.DrawCircle(200, 200, 100, paint);using(var paintB=new SKPaint()){paintB.Color = SKColors.Blue.WithAlpha(128);canvas.SaveLayer(new SKRect(280,120,470,280),paintB);canvas.DrawCircle(375,200,100, paintB);canvas.Restore();canvas.DrawCircle(288, 300, 100, paint);}
}

SaveLayer

Scale 缩放画布

public void Scale (SkiaSharp.SKPoint size);
public void Scale (float s);
public void Scale (float sx, float sy);
public void Scale (float sx, float sy, float px, float py);

指定水平、垂直和缩放点后对画布进行缩放。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);using (var paint = new SKPaint())
{paint.IsStroke = true;paint.StrokeWidth = 5;paint.Color = SKColors.Red.WithAlpha(128);canvas.DrawCircle(100, 100, 50, paint);canvas.Save();canvas.Scale(3F);paint.Color = SKColors.Blue.WithAlpha(128);canvas.DrawCircle(100, 100, 50, paint);canvas.Restore();canvas.Save();canvas.Scale(2F, 2F, 100, 100);paint.Color = SKColors.Green.WithAlpha(128);canvas.DrawCircle(100, 100, 50, paint);
}
  1. 绘制一个圆
  2. 将画布按原点放大3倍后,再次绘制圆
  3. 将画布按原始圆心放大2倍后,再次绘制圆。

Scale

SetMatrix 设置矩阵

public void SetMatrix (SkiaSharp.SKMatrix matrix);

设置画布矩阵。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
{paint.IsStroke = true;paint.StrokeWidth = 2;paint.TextSize = 18;paint.Color = SKColors.Red;paint.Typeface = SKTypeface.FromFamilyName("宋体");paint.TextAlign = SKTextAlign.Center;for (int degree = 0; degree <= 330; degree += 30){//绕中心旋转30var matrix = SKMatrix.CreateRotationDegrees(degree, info.Width / 2F, info.Height / 2F);canvas.SetMatrix(matrix);var centerPt = new SKPoint(info.Width / 2F + 200, info.Height / 2F);canvas.DrawCircle(centerPt, 50, paint);canvas.DrawText($"{degree}°", centerPt, paint);}}

1.通过设置画布的矩阵,绕中心点,每30度画一个圆

SetMatrix

Skew 倾斜

public void Skew (SkiaSharp.SKPoint skew);
public void Skew (float sx, float sy);

设置水平与垂直倾斜。

var canvas = e.Surface.Canvas;
var info = e.Info;
canvas.Clear(SKColors.White);
using (var paint = new SKPaint())
{paint.IsStroke = true;paint.IsAntialias = true;paint.StrokeWidth = 1;paint.TextSize = 36;var centerPt = new SKPoint(info.Width / 2F, info.Height / 2F);var lineLen = 200F;paint.Color = SKColors.Red;var degree = 30F;//canvas.DrawArc(new SKRect(centerPt.X - lineLen, centerPt.Y - lineLen, centerPt.X + lineLen, centerPt.Y + lineLen), 270 - degree, degree, true, paint);canvas.DrawArc(new SKRect(centerPt.X - 50, centerPt.Y - 50, centerPt.X + 50, centerPt.Y + 50), 270 - degree, degree, true, paint);var radian = degree * Math.PI / 180;float sin = (float)Math.Sin(radian);float cos = (float)Math.Cos(radian);float dstX = centerPt.X + lineLen * cos;float dstY = centerPt.Y + lineLen * sin;//注意原点移至中心canvas.Translate(centerPt.X, centerPt.Y);// 应用倾斜变换 (例如,X 轴倾斜 30 度,Y 轴倾斜 0 度)float skewX = (float)Math.Tan(degree * Math.PI / 180); // 将角度转换为弧度float skewY = 0;canvas.Skew(skewX, skewY);paint.Color = SKColors.Blue;canvas.DrawRect(SKRect.Create(200, 200), paint);canvas.DrawText($"SkewX = {degree}°", 0, 0, paint);//倾斜后的坐标//x'=x+y*skewX//y'=y+x*skewY
}

1.在画布中心绘制一个倾斜30度的文本

Skew
注意倾斜角度的不同,文本的倾斜方向不同。
正:文本向左倾斜。
负:文本向右倾斜。

Translate 平移

public void Translate (SkiaSharp.SKPoint point);
public void Translate (float dx, float dy);

将画布原点进行水平和垂直平移。

[System.ComponentModel.Description("SKCanvas.Translate平移")]
public void OnPaintSurface14_10(object sender, SkiaSharp.Views.Desktop.SKPaintGLSurfaceEventArgs e)
{var canvas = e.Surface.Canvas;var info = e.Info;infoWidth= info.Width;infoHeight= info.Height;canvas.Clear(SKColors.White);using (var paint = new SKPaint()){paint.IsStroke = true;paint.IsAntialias = true;paint.StrokeWidth = 1;paint.Color = SKColors.Green;var radius = 50;if (timer == null){timer = new System.Windows.Forms.Timer();timer.Interval = 1000 / 24;timer.Tick += (o, t) =>{TranslateX += xStep;if (TranslateX >= infoWidth - radius){xStep = -xStep;TranslateX = infoWidth - radius;}else if (TranslateX <= radius){xStep = -xStep;TranslateX = radius;}TranslateY += yStep;if (TranslateY >= infoHeight - radius){yStep = -yStep;TranslateY = infoHeight - radius;}else if (TranslateY <= radius){yStep = -yStep;TranslateY = radius;}this.TNTechImageBox.Invalidate();};timer.Start();}canvas.Translate(TranslateX, TranslateY);canvas.DrawCircle(0,0, radius, paint);}
}
float infoWidth = 0;
float infoHeight = 0;
float TranslateX = 100;
float TranslateY = 100;
float xStep = 5;
float yStep = 5;

使用平移,绘制一个圆,看上去遇到画布四周时,进行反弹。
Translate

相关文章:

【SkiaSharp绘图14】SKCanvas方法详解(三)URL注释、按顶点绘制、 是否裁切区域之外、旋转、缩放、倾斜、平移、保存/恢复画布

文章目录 SKCanvas方法DrawUrlAnnotation 绘制URL注释DrawVertices 按顶点绘制Flush 立即绘制QuickReject 判断区域是否在裁切区域之外ResetMatrix重置矩阵Restore、RestoreToCountRotateDegrees按角度旋转画布RotateRadians按弧度旋转画布SaveLayer保存并新建图层Scale 缩放画…...

WebDriver API (2)

本文将继续上文对WebDriver API的功能使用进行介绍。 一、浏览器操作 1. 浏览器前进forward与后退back 浏览器前进操作是指导航到前一个页面&#xff0c;在浏览器的历史记录中向前移动一页。 浏览器后退操作是指导航到前一个页面&#xff0c;在浏览器的历史记录中向后移动一…...

GCP FrontendConfig 详解:优化您的云负载均衡

目录 1. 什么是GCP FrontendConfig? 2. FrontendConfig的主要功能 2.1 协议选择 2.2 SSL/TLS配置 2.3 重定向配置 2.4 自定义响应头 3. 配置FrontendConfig 4. FrontendConfig的高级特性 4.1 智能路由 4.2 流量控制 4.3 日志和监控 5. FrontendConfig最佳实践 5.…...

TensorFlow代码逻辑 vs PyTorch代码逻辑

文章目录 一、TensorFlow&#xff08;一&#xff09;导入必要的库&#xff08;二&#xff09;加载MNIST数据集&#xff08;三&#xff09;数据预处理&#xff08;四&#xff09;构建神经网络模型&#xff08;五&#xff09;编译模型&#xff08;六&#xff09;训练模型&#xf…...

boost asio异步服务器(4)处理粘包

粘包的产生 当客户端发送多个数据包给服务器时&#xff0c;服务器底层的tcp接收缓冲区收到的数据为粘连在一起的。这种情况的产生通常是服务器端处理数据的速率不如客户端的发送速率的情况。比如&#xff1a;客户端1s内连续发送了两个hello world&#xff01;,服务器过了2s才接…...

【QT】常用控件|widget|QPushButton|RadioButton|核心属性

目录 ​编辑 概念 信号与槽机制 控件的多样性和定制性 核心属性 enabled geometry ​编辑 windowTiltle windowIcon toolTip styleSheet PushButton RadioButton 概念 QT 控件是构成图形用户界面&#xff08;GUI&#xff09;的基础组件&#xff0c;它们是实现与…...

【C++ Primer Plus学习记录】函数参数和按值传递

函数可以有多个参数。在调用函数时&#xff0c;只需使用都逗号将这些参数分开即可&#xff1a; n_chars(R,25); 上述函数调用将两个参数传递给函数n_chars()&#xff0c;我们将稍后定义该函数。 同样&#xff0c;在定义函数时&#xff0c;也在函数头中使用由逗号分隔的参数声…...

MySQL:设计数据库与操作

设计数据库 1. 数据建模1.1 概念模型1.2 逻辑模型1.3 实体模型主键外键外键约束 2. 标准化2.1 第一范式2.2 链接表2.3 第二范式2.4 第三范式 3. 数据库模型修改3.1 模型的正向工程3.2 同步数据库模型3.3 模型的逆向工程3.4 实际应用建议 4. 数据库实体模型4.1 创建和删除数据库…...

OBS 免费的录屏软件

一、下载 obs 【OBS】OBS Studio 的安装、参数设置和录屏、摄像头使用教程-CSDN博客 二、使用 obs & 输出无黑屏 【OBS任意指定区域录屏的方法-哔哩哔哩】 https://b23.tv/aM0hj8A OBS任意指定区域录屏的方法_哔哩哔哩_bilibili 步骤&#xff1a; 1&#xff09;获取区域…...

uniapp微信小程序使用xr加载模型

1.在根目录与pages同级创建如下目录结构和文件&#xff1a; // index.js Component({properties: {modelPath: { // vue页面传过来的模型type: String,value: }},data: {},methods: {} }) { // index.json"component": true,"renderer": "xr-frame&q…...

机器人运动范围检测 c++

地上有一个m行n列的方格&#xff0c;一个机器人从坐标&#xff08;0&#xff0c;0&#xff09;的格子开始移动&#xff0c;它每次可以向上下左右移动一个格子&#xff0c;但不能进入行坐标和列坐标的位数之和大于k的格子&#xff0c;请问机器人能够到达多少个格子 #include &l…...

kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验

场景&#xff1a;kettle调用https接口&#xff0c;跳过校验SSL。&#xff08;有些公司内部系统之间的https的接口是没有SSL校验这一说&#xff0c;无需使用用证书的&#xff09; 解决方案&#xff1a;自定义插件或者自定义jar包通过javascript调用https接口。 1、http post 步…...

C++轻量级 线程间异步消息架构(向曾经工作的ROSA-RB以及共事的DOPRA的老兄弟们致敬)

1 啰嗦一番背景 这么多年&#xff0c;换着槽位做牛做马&#xff0c;没有什么钱途 手艺仍然很潮&#xff0c;唯有对于第一线的码农工作&#xff0c;孜孜不倦&#xff0c;其实没有啥进步&#xff0c;就是在不断地重复&#xff0c;刷熟练度&#xff0c;和同期的老兄弟们&#xf…...

Kotlin中的类

类初始化顺序 constructor 里的参数列表是首先被执行的&#xff0c;紧接着是 init 块和属性初始化器&#xff0c;最后是次构造函数的函数体。 主构造函数参数列表firstProperty 初始化第一个 init 块secondProperty 初始化第二个 init 块次构造函数函数体 class Example const…...

VSCode中常用的快捷键

通用操作快捷键 显示命令面板&#xff1a;Ctrl Shift P or F1&#xff0c;用于快速访问VSCode的各种命令。 快速打开&#xff1a;Ctrl P&#xff0c;可以快速打开文件、跳转到某个行号或搜索项目内容。 新建窗口/实例&#xff1a;Ctrl Shift N&#xff0c;用于打开一个新的…...

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…...

Rust Eq 和 PartialEq

Eq 和 PartialEq 在 Rust 中&#xff0c;想要重载操作符&#xff0c;你就需要实现对应的特征。 例如 <、<、> 和 > 需要实现 PartialOrd 特征: use std::fmt::Display;struct Pair<T> {x: T,y: T, }impl<T> Pair<T> {fn new(x: T, y: T) ->…...

思考如何学习一门编程语言?

一、什么是编程语言 编程语言是一种用于编写计算机程序的人工语言。通过编程语言&#xff0c;程序员可以向计算机发出指令&#xff0c;控制计算机执行各种任务和操作。编程语言由一组语法规则和语义规则组成&#xff0c;这些规则定义了如何编写代码以及代码的含义。 编程语言…...

顺序串算法库构建

学习贺利坚老师顺序串算法库 数据结构之自建算法库——顺序串_创建顺序串s1,创建顺序串s2-CSDN博客 本人详细解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在贺利坚老师算法库指导下, 结合本人详细解析博客思路基础上,进行测试, 加入异常弹出信息 v1.0补…...

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性&#xff0c;在任意域上进行任意的多目标跟踪&#xff0c;而无需任何额外的标注。 其核心思想就是在训练的过程中&#xff0c;利用strong augmentation对一张图片进行变换&#xff0c;然后用SAM分割出其中的对象&#xff0c;因此可以找到一组图…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...