canvas入门详细教程(W3C)

文章目录

  • 一、线形
    • 1、画线形之前,最基本的方法需要知道:
    • 2、线形的样式设置:
    • 3、不同的线形路径给不同的样式设置-需要知道俩个方法:
    • 4、画线形三角
    • 5、画贝塞尔曲线
    • 6、画虚线
  • 二、画矩形
    • 1、绘制空心矩形有三种方法
    • 2、绘制填充矩形有俩种方法:
  • 三、画圆弧⌒⚪
    • 1、画圆弧一般有两种方式
    • 2、画椭圆
  • 四、绘制文本
    • 1、strokeText(), fillStroke()绘制文本
    • 2、文本样式
  • 五、样式补充
    • 1、线性渐变色
    • 2、径向渐变
    • 3、阴影样式
    • 4、添加指定元素
  • 六、绘制图片
    • 1、使用drawImage()方法绘制图片
    • 2、绘制图片的合成、保存和还原绘画状态、变形、裁剪


详细介绍画布canvas的属性及方法,和矩形,路径,转化,文本,图像绘制等多个模块的使用。并附上代码示例+代码注解。
使用画布canvas之前,必做的三步:
①首先要有一用来画画的纸:

// 创建canvas标签:
<canvas id="canvas" height="400" width="400" style="box-shadow: 0 0 7px 0 #888888"></canvas>

②找到这张纸:

// 我们现在要使用JS获得这个canvas标签的DOM对象:
<script>
    const canvas = document.getElementById('canvas')
</script>

③决定是画二维还是三维的画:

// 通过getContext()方法来获得渲染上下文和它的绘画功能:
<script>
    const ctx = canvas.getContext('2d') // 这里我们先聚焦于2D图形
</script>

一、线形

1、画线形之前,最基本的方法需要知道:

moveTo(x,y):路径绘制命令的起点
lineTo(x,y):路径绘制转折点
stroke():绘制路径

const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
// 第一条线性
ctx.moveTo(0,0); 	// 路径绘制命令的起点
ctx.lineTo(350,50); // 路径绘制转折点
ctx.stroke();  		// 绘制路径
// 第二条线形
ctx.moveTo(0,200);  
ctx.lineTo(50,200); 
ctx.lineTo(50,150);
ctx.lineTo(100,150);
ctx.lineTo(100,200);
ctx.lineTo(150,200);
ctx.lineTo(150,150);
ctx.lineTo(200,150);
ctx.stroke();

绘制结果如图:
canvas1

2、线形的样式设置:

strokeStyle = '颜色':设置线的颜色;
lineWidth = 数字:设置线的宽度;
lineCap = 'round/butt/square':设置线帽为圆型/默认/方形;
lineJoin = 'miter/round/bevel':设置线段连接处为默认/圆形/平直形式;
globalAlpha = 数字:设置图案的透明度
需要注意的是:这些样式设置,必须在ctx.stroke()之前给。因为ctx.stroke()是绘制图形轮廓,图形轮廓都已经画出来了,在它之后给是不生效的。

ctx.moveTo(0,200);  
ctx.lineTo(50,200); 
ctx.lineTo(50,150);
ctx.lineTo(100,150);
ctx.lineTo(100,200);
ctx.lineTo(150,200);
ctx.lineTo(150,150);
ctx.lineTo(200,150);
ctx.strokeStyle = 'red'; // 线形颜色
ctx.lineWidth = 6; // 线宽
ctx.globalAlpha = 0.5; // 透明度
ctx.lineCap = 'round'; // 线形末端样式圆型
ctx.lineJoin = 'round'; // 线形连接样式圆型
ctx.stroke();

线段样式效果如图:
canvas2

3、不同的线形路径给不同的样式设置-需要知道俩个方法:

beginPath():开启一条新路径,生成之后,图形绘制命令会被指向到新路径上;
closePath():关闭路径,生成闭合路径之后,图形绘制命令又重新指向到上下文中;

// 第一条
ctx.beginPath(); // 开启一条新路径
ctx.moveTo(0,0);
ctx.lineTo(350,50);
ctx.lineWidth = 1;
ctx.strokeStyle = 'blue';
ctx.lineCap = 'butt';
ctx.stroke();
ctx.closePath(); // 关闭路径
// 第二条
ctx.beginPath(); // 开启一条新路径
ctx.moveTo(0,200);
ctx.lineTo(50,200);
ctx.lineTo(50,150);
ctx.lineTo(100,150);
ctx.lineTo(100,200);
ctx.lineTo(150,200);
ctx.lineTo(150,150);
ctx.lineTo(200,150);
ctx.lineWidth = 5;
ctx.strokeStyle = 'red';
ctx.lineCap = 'round';
ctx.stroke();
ctx.closePath(); // 关闭路径

使用了beginPath、closePath 和 未使用的效果:
eg:在第二个效果图中,没有开辟新路径,导致第二条线形效果覆盖了第一条的样式效果。
canvas3

4、画线形三角

画线形三角也是用画线的思路,需要注意首尾点连接起来即可:

ctx.beginPath();
ctx.moveTo(60,60);
ctx.lineTo(150,60);
ctx.lineTo(150,150);
ctx.lineTo(60,60);
ctx.stroke();
ctx.closePath();

绘制效果如图:
canvas4
如果要添加样式也是一样的:

// 画三角                           // 闭合处显示的更衔接一点
ctx.beginPath();                    ctx.beginPath();
ctx.moveTo(60,60);                  ctx.moveTo(60,60);
ctx.lineTo(150,60);                 ctx.lineTo(150,60);    
ctx.lineTo(150,150);                ctx.lineTo(150,150);    
ctx.lineTo(60,60);                  ctx.lineTo(60,60);
ctx.lineWidth = 5;                  ctx.closePath();
ctx.strokeStyle = 'red'             ctx.lineWidth = 5;
ctx.stroke();                       ctx.strokeStyle = 'red';        
ctx.closePath();                    ctx.stroke(); 

绘制效果:
canvas5

5、画贝塞尔曲线

推荐一个在线调试二次贝塞尔曲线的小工具:在线调试工具
1、quadraticCurveTo(cpx,cpy,x,y)方法来绘制二次贝塞尔曲线:
cpx,cpy:控制点坐标
x,y:结束点坐标
在它之前有一个开始点坐标,一般由moveTo()或lineTo()方法提供。

ctx.beginPath();
ctx.moveTo(100,150);
ctx.quadraticCurveTo(250, 10, 300, 100); // 控制点(250,10)结束点(300, 100)
ctx.stroke();
ctx.closePath();

canvas10
2、bezierCurveTo(cpx1,cpy1,cpx2,cpy2,x,y)来绘制三次贝塞尔曲线:
cpx1,cpy1:第一个控制点坐标
cpx2,cpy2:第二个控制点坐标
x,y:结束点坐标

// 三次贝塞尔曲线
ctx.beginPath();
ctx.moveTo(100,150);
ctx.bezierCurveTo(200,10, 275,250, 380,150); //控制点1(200,10)控制点2(275,250)结束点(300,100)
ctx.stroke();
ctx.closePath();
// 辅助线
ctx.beginPath();
ctx.moveTo(100, 150);
ctx.lineTo(200, 10);
ctx.lineTo(275, 250);
ctx.lineTo(380, 150);
ctx.strokeStyle = 'red';
ctx.stroke();
ctx.closePath();

canvas11

6、画虚线

setLineDash([])方法来绘制虚线,可以接收若干个参数。
数组参数会“铺开”,下标为偶数的项为实线,为奇数项为透明线段,数字的大小代表着线段的长度。
getLineDash()方法可以获得当前虚线设置的样式。如下面虚线样式,得到的结果是[10,5]

ctx.beginPath();
ctx.moveTo(100, 150);
ctx.lineTo(200, 10);
ctx.lineTo(275, 250);
ctx.lineTo(380, 150);
ctx.strokeStyle = 'red';
ctx.setLineDash([10, 5])
ctx.stroke();
ctx.closePath();

canvas12

二、画矩形

1、绘制空心矩形有三种方法

第一种跟绘制三角形思路是一样的;第二种是strokeRect方法绘制;第三种是stroke()和rect()方法。
下面看一下三种方式绘制的空心矩形:

// 绘制三角思路绘制矩形        // strokeRect(x,y,width,height)     // stroke()和rect()     
ctx.beginPath();             ctx1.beginPath();                   ctx2.beginPath();        
ctx.moveTo(50,50);           ctx1.strokeRect(50,50,100,100)      ctx2.rect(50,50,100,100);     
ctx.lineTo(150,50);          ctx1.closePath();                   setTimeout(() => {        
ctx.lineTo(150,150);                                                ctx2.stroke();        
ctx.lineTo(150,150);                                             }, 2000);           
ctx.lineTo(50,150);                                              ctx2.closePath();          
ctx.lineTo(50,50);            									
ctx.stroke();           
ctx.stroke();          
ctx.closePath();    

rect()暂时生成了矩形,但必须调用stroke()方法才会绘制出来
三种方式绘制效果如图:
canvas6

2、绘制填充矩形有俩种方法:

第一种是fillRect()和fillStyle()方法;第二种是rect()和fill()方法。
下面看一下两种方式绘制的空心矩形:

// fillRect()和fillStyle()填充矩形   // rect()和fill()填充矩形
ctx.beginPath();                    ctx1.beginPath();
ctx.fillStyle = 'skyblue';          ctx1.rect(50, 50, 100, 100);
ctx.fillRect(50, 50, 100, 100);     setTimeout(() => {
ctx.closePath();                        ctx1.fill();
                                    }, 2000);                              
                                    ctx1.closePath();

fillStyle()填充颜色一定要写在生成矩形fillRect()之前,否则颜色不生效
fill()方法和stroke()方法都是用来绘制出来形状,只不过前者是填充绘制,后者是用线轮廓。
两种方式绘制效果如图:
canvas7

三、画圆弧⌒⚪

1、画圆弧一般有两种方式

第一种:
arc(x, y, radius, startAngle, endAngle, anticlockwise)方法生成⚪⌒,然后stroke()方法绘制。
x,y:圆形坐标
radius:半径
startAngle:初始角度
endAngle:结束角度
anticlockwise:false顺时针或true逆时针(默认为false)
第二种:
先是一般由moveTo()或lineTo()方法提供起始点,然后arcTo(x1,y1,x2,y2,radius)方法来绘制圆弧。
x1,y1:两切线交点坐标
x2,y2:结束点坐标
radius:半径

// 1、arc()绘制圆
ctx.beginPath();
ctx.arc(100, 100, 50, 0, [(Math.PI) / 180] * 360); // (Math.PI) / 180 = 1°
ctx.stroke(); // 如果此处改为使用fill()方法,那么将会绘制出填充的圆
ctx.closePath();
// 2、arc()绘制圆弧
ctx1.beginPath();
ctx1.arc(100, 100, 50, 0, [(Math.PI) / 180] * 90); // (Math.PI) / 180 = 1°
ctx1.stroke();
ctx1.closePath();
// 3、arcTo()绘制圆弧
ctx2.beginPath();
ctx2.moveTo(100, 100); // 定义线段的起点
ctx2.arcTo(150, 50, 200, 200, 45); // 切线交点坐标为(150,50),结束点为(200,200)
ctx2.lineWidth = 1;
ctx2.stroke();
ctx2.closePath();
// 辅助线
ctx2.beginPath();
ctx2.moveTo(100, 100);
ctx2.lineTo(150, 50);
ctx2.lineTo(200, 200);
ctx2.strokeStyle = 'red';
ctx2.stroke();
ctx2.closePath();

注意事项:

  1. arcTo()方法是用“开始点”、“控制点”和“结束点”三点所形成夹角,绘制与夹角的两边相切且半径为radius的圆弧。控制点:夹角俩边相交点。
  2. 弧线的起点是“开始点所在边与圆的切点”,而弧线的终点是“结束点所在边与圆的切点”。
  3. arcTo()方法绘制的弧线是两个切点之间长度最短的那个圆弧。
  4. 如果开始点不是弧线起点,arcTo()方法还将添加一条当前端点到弧线起点的直线线段。也就是说,开始点坐标不一定是弧线起点坐标。通俗点讲就是:开始点到弧线起点会有一段直线线段。

两种方式绘制结果:
canvas8

2、画椭圆

用ellipse(x,y,radiusX,radiusY,rotation,startAngle,endAngle,anticlockwise)方法来绘制椭圆。
x,y:圆心坐标
radiusX:x轴半径
radiusY:y轴半径
rotation:椭圆旋转角度
startAngle:开始绘制点
endAngle:结束绘制点
anticlockwise:false顺时针或true逆时针(默认false)

// 椭圆
ctx.beginPath();
// 旋转角度[(Math.PI)/180]*60	起点[(Math.PI)/180]*0   终点[(Math.PI)/180]*360
ctx.ellipse(100,100,50,100, [(Math.PI)/180]*60, [(Math.PI)/180]*0, [(Math.PI)/180]*360);
ctx.stroke();
ctx.closePath();

// 给椭圆填充色stroke()换成fill()
// ctx.fillStyle = 'skyblue'
// ctx.fill()

canvas9

四、绘制文本

1、strokeText(), fillStroke()绘制文本

使用strokeText(text,x,y,maxWidth)方法绘制描边文本。
使用fillStroke(text,x,y,maxWidth)方法绘制填充文本。
text:需要绘制的文本
x,y:文本左下角起始坐标
maxWidth:文本最大宽度

// 绘制描边文本									// 绘制填充文本
ctx.beginPath();								ctx1.beginPath();
ctx.font = '50px Verdana';						ctx1.font = '50px Verdana';
ctx.strokeText('Hello Canvas!', 30, 180, 400);	ctx1.fillText('Hello Canvas!', 30, 180, 400);
ctx.closePath();								ctx1.closePath();
ctx.beginPath();
ctx.font = '20px Verdana';
ctx.strokeText('Helvas!', 30, 280, 400);
ctx.closePath();

canvas13

2、文本样式

.font设置文本大小和字体。
.textAlign设置水平对齐方式,值可选left/right/center/start/end。对齐方式以strokeText()方法中坐标参数为参考。

// 绘制水平居中描边文本
ctx.beginPath();
ctx.font = '50px Verdana';
ctx.textAlign = 'center';
ctx.strokeText('Hello Canvas!', 200, 200, 400);
ctx.closePath();
// 辅助线
ctx.beginPath();
ctx.moveTo(200,0);
ctx.lineTo(200, 400);
ctx.setLineDash([10, 5])
ctx.stroke();
ctx.closePath();
ctx.beginPath();
ctx.moveTo(0,200);
ctx.lineTo(400, 200);
ctx.setLineDash([10, 5])
ctx.stroke();
ctx.closePath();

strokeText()绘制文本的坐标在画布的中心点(200,200),textAlign = center居中对齐则是以中心点为参考水平对齐。
canvas14
.textBaseline设置垂直对齐方式,值可选alphabetic/top/hanging/middle/ideographic/bottom
.direction:设置文本绘制方向,值可选ltr(left to right)和rtl(right to left)。

// 水平左对齐,垂直上对齐
ctx.beginPath();
ctx.font = '20px Verdana';
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.strokeText('Hello!', 0, 200, 400);
ctx.closePath();
// 水平居中,垂直居中
ctx.beginPath();
ctx.font = '20px Verdana';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.strokeText('Hello Canvas!', 200, 200, 400);
ctx.closePath();
// 水平右对齐,垂直下对齐 + 文本绘制方向rtl`(right to left)
ctx.beginPath();
ctx.font = '20px Verdana';
ctx.textAlign = 'right';
ctx.textBaseline = 'bottom';
ctx.direction = 'rtl';
ctx.strokeText('Canvas!', 400, 200, 400);
ctx.closePath();

canvas16
measureText(text)方法测量文本的宽度。
text:测量的文本
注意:不是必须显示出文本来才能计算文本的长度,测量结果也不受文本的最大宽度等外界因素的影响,文本长度的测量结果只和文本的font参数相关。

五、样式补充

1、线性渐变色

使用createLinearGradient(x1,y1,x2,y2)来创建线性渐变色。
x1,y1:渐变色起点坐标
x2,y2:终点坐标
使用addColorStop(offset,color)添加渐变色。
offset:偏移值
color:渐变色

// 横向线性渐变色
ctx.beginPath();
const gradient = ctx.createLinearGradient(0,0,400,0);
gradient.addColorStop(0, 'skyblue');
gradient.addColorStop(1, '#fffc96');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 400, 400)
ctx.closePath();

线形渐变步骤就是:先是使用createLinearGradient创建一个线性渐变对象;然后使用addColorStop添加颜色;然后使用fillStyle设置填充颜色(就是线形渐变对象);最后使用fillRect填充。
canvas7

2、径向渐变

使用createRadialGradient(x1,y1,r1,x2,y2,r2)方法来创建渐径向渐变色。
x1,y1:开始圆的圆心坐标
r1:开始圆的半径
x2,y2:结束圆的圆心坐标
r2:结束圆的半径

// 径向渐变
ctx.beginPath();
const gradient = ctx.createRadialGradient(200,200, 100, 200, 200, 200);
gradient.addColorStop(0, 'skyblue');
gradient.addColorStop(1, '#fffc96');
ctx.fillStyle = gradient;
ctx.fillRect(0, 0, 400, 400);
ctx.closePath();

径向渐变步骤就是:同线形渐变是一样的。先是使用createRadialGradient创建一个径向渐变对象;然后使用addColorStop添加颜色;然后使用fillStyle设置填充颜色(就是径向渐变对象);最后使用fillRect填充。
canvas18

3、阴影样式

shadowOffsetX = 数字:设置阴影在X轴上的延申距离,正值表示阴影向x轴正方向延申,负值表示阴影向x轴负方向延申。
shadowOffsetY = 数字:设置阴影在Y轴上的延申距离,正值表示阴影向y轴正方向延申,负值表示阴影向y轴负方向延申。
shadowBlur = 数字:设定阴影的模糊度,默认为0。
shadowColor = '颜色':设置阴影的颜色,默认是全透明色。

// 绘制带阴影的线段:
ctx.moveTo(50, 50)
ctx.lineTo(100, 50)
ctx.shadowOffsetX = 10 // 向x轴正方向平移10像素
ctx.shadowOffsetY = 10 // 向y轴正方向平移10像素
ctx.shadowColor = '#ccc' // 设置阴影颜色
ctx.shadowBlur = 3 // 设置阴影模糊度
ctx.lineWidth = 6
ctx.stroke()
// 绘制带阴影的文本:
ctx.lineWidth = 1
ctx.font = '30px Verdana'
ctx.textAlign = 'center'
ctx.textBaseline = 'middle'
ctx.strokeText('Hello Canvas!', 200, 200, 400)

效果:
canvas20

4、添加指定元素

使用createPattern(pattern,type)方法添加指定元素。
pattern:要添加的元素,可以是图片,视频,canvas对象
type:绘制类型,可选repeat/no-repeat/repeat-x(沿x轴平铺)/repeat-y(沿y轴平铺)

// 添加图片
const img = new Image();
img.src = "https://phper-1234567890.cos.ap-guangzhou.myqcloud.com/logoCopy.png";
img.onload = function () {
   const ptrn = ctx.createPattern(img, 'repeat');
   ctx.fillStyle = ptrn;
   ctx.fillRect(0, 0, 400, 400);
};

填充结果:
canvas9

六、绘制图片

1、使用drawImage()方法绘制图片

drawImage(img,x,y,width,height,sx,sy,swidth,sheight)可以接收3-9个参数进行拉伸、裁剪等。
img:需要绘制的图片(必填参数)
x,y:绘制的坐标(必填参数)
width,height:图片拉伸宽度、高度
sx,sy:开始裁切的位置
swidth,sheight:要裁切图像的宽高

// 1、绘制基础图片
var img = new Image();
img.src = 'https://phperzlz-1234567890.cos.ap-guangzhou.myqcloud.com/apply/logo2.png';
img.onload = function () {
    ctx.drawImage(img, 0, 0); // 在(0,0)处绘制原图
};
// 2、绘制拉伸图片
var img = new Image();
img.src = 'https://phperzlz-1234567890.cos.ap-guangzhou.myqcloud.com/apply/logo2.png';
img.onload = function () {
    ctx.drawImage(img, 0, 0, 400, 400); // 在(0,0)处绘制原图,拉伸至(400, 400)的图片
};
///3、绘制裁切拉伸图片
var img = new Image();
img.src = 'https://phperzlz-1234567890.cos.ap-guangzhou.myqcloud.com/apply/logo2.png';
img.onload = function () {
	// 在(50,50)处裁切,裁切成(100,100)的图片;在(0,0)处绘制原图,拉伸至(400, 400)的图片
    ctx.drawImage(img, 50, 50, 200, 200,0, 0, 400, 400); 
};
// 4、通过拿到image的DOM元素,来绘制图片
const img = document.getElementById('img');
img.onload = function () {
    ctx.drawImage(img,0, 0); // 在(0,0)处绘制原图
};

注意:先是裁切参数后绘制参数
效果:
canvas21
绘制图片除了通过new Image对象来绘制,还可以通过DOM来绘制图片,效果是一样的:
canvas22

2、绘制图片的合成、保存和还原绘画状态、变形、裁剪

合成:在绘制多个图案的时候,就需要考虑先后显示问题。通过globalCompositeOperation来控制谁覆盖谁,值可选:
source-over:在已有图像之上绘制新图像(默认值)
source-in:只会展示新图像与已有图像重叠的部分
source-out:在已有图像之外显示新图像,只有已有图像之外的新图像部分显示,已有图像是透明的
source-atop:在已有图像顶部显示新绘制的图像。已有图像位于新绘制图像之外的部分是不可见的
destination-over:与source-over相反,在已有图像之后绘制新图像
destination-in:与source-in相反,显示的是最开始的已有图像
destination-out:在新绘制图像之外显示已有图像。只有新图像之外的已有图像部分显示,新绘制图像是透明的
destination-atop:在新绘制图像顶部显示已有图像。已有图像位于新绘制图像之外的部分是不可见的
lighter:折叠图像的颜色是有颜色值相加得来的
xor:两个图像重叠部分变为透明的

// 1、source-over
ctx.arc(350, 200, 200, 0, [(Math.PI) / 180] * 360)
ctx.fillStyle = 'skyblue'
ctx.globalCompositeOperation = 'source-over'
ctx.fill()
ctx.beginPath()
ctx.arc(200, 400, 200, 0, [(Math.PI) / 180] * 360)
ctx.fillStyle = '#fffc96'
ctx.globalCompositeOperation = 'source-over'
ctx.fill()
ctx.closePath();
// 2、xor
ctx.arc(350, 200, 200, 0, [(Math.PI) / 180] * 360)
ctx.fillStyle = 'skyblue'
ctx.globalCompositeOperation = 'source-over'
ctx.fill()
ctx.beginPath()
ctx.arc(200, 400, 200, 0, [(Math.PI) / 180] * 360)
ctx.fillStyle = '#fffc96'
ctx.globalCompositeOperation = 'xor'
ctx.fill()

canvas23


更多详细内容:
https://blog.csdn.net/nvgis/article/details/127316552

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

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

相关文章

【sklearn基础入门教程】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

c++ 设计模式 的课本范例

( 0 ) 这里补充面向对象设计的几个原则&#xff1a; 开闭原则OCP &#xff1a; 面向增补开放&#xff0c;面向代码修改关闭。其实反映到代码设计上就是类的继承&#xff0c;通过继承与多态&#xff0c;可以不修改原代码&#xff0c;又增加新的类似的功能。 依赖倒置原则 Depend…

在Mandelbrot 集中“缩放”特定区域

1、问题背景 在创建一个快速生成 Mandelbrot 集图像的 Python 程序时&#xff0c;程序开发者遇到一个问题&#xff1a;他想要渲染该集合的一个特定区域&#xff0c;但他不知道如何修改代码中的数学部分来实现 “缩放”。 2、解决方案 第一种解决方案 问题根源是代码中的一行…

qt开发-14_QListwidget 仿qq好友列表制作

QListWidget 继承 QListView。QListWidget 类提供了一个基于项的列表小部件。QListWidg et 是一个便捷的类&#xff0c;它提供了一个类似于 QListView&#xff08;下一小节将讲到&#xff09;提供的列表视图&#xff0c;但 是提供了一个用于添加和删除项目的基于项目的经典接口…

智慧互联:Vatee万腾平台展现科技魅力

随着科技的迅猛发展&#xff0c;我们的生活正逐渐变得智能化、互联化。在这个信息爆炸的时代&#xff0c;一个名为Vatee万腾的平台正以其独特的魅力&#xff0c;引领我们走向一个更加智能的未来。 Vatee万腾&#xff0c;这个名字本身就充满了对科技未来的憧憬与期待。作为一家专…

Jacob------VBA的局限性(复杂批注的获取方式)

问题再现&#xff1a; 同一个字段被多个批注 使用VBA代码是获取不到他们的关系的 &#xff0c;原因如下&#xff1a; 同一个字段被多个批注&#xff0c;并且每个批注都有回复是无法通过VBA语言获取的 &#xff0c;解释如下&#xff1a; ① 微软Microsoft 官方文档 提供的API …

微信营销自动化(朋友圈自动点赞工具):UIAutomation的解决方案

文章不用看, 是AI生成的, 请直接查看下载地址 http://www.aisisoft.top . 微信朋友圈自动点赞工具, 自动群发工具 在当今的数字化营销领域&#xff0c;自动化工具成为了提升工作效率、增强客户互动的关键。本文将详细介绍一款基于UIAutomation框架与Python语言构建的微信营销自…

【MySQL】如果表被锁可以尝试看一下事务

今天在MySQL中删除表的时候&#xff0c;发现无法删除&#xff0c;一执行drop&#xff0c;navicat就卡死。 通过 SHOW PROCESSLIST显示被锁了 kill掉被锁的进程后依旧被锁 最后发现是由于存在为执行完的事务 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX; kill掉这些事务以…

Excel 查找后隐去右边列

Excel 有几列数字 ABC11002042002202100102326027010841199100512100100 当给定参数时&#xff0c;请从每行找到该参数&#xff0c;隐去右边的列。如果某行不含该参数&#xff0c;则隐去整行。当参数是 100 时&#xff0c;结果如下&#xff1a; ABC710082021009119910010121…

挑战极限外,交易无疆界

交易&#xff0c;并非是仅限于金融行业的专属舞台&#xff01;在Eagle Trader&#xff0c;我们深信&#xff0c;无论您来自何方&#xff0c;都怀揣着独特的视角和优势&#xff0c;能在交易场上展现出别具一格的策略。 我们热烈欢迎来自各行各业的交易者&#xff0c;因为正是你…

随心笔记,第七更之Java 加密Jar包

目录 一、Linux搭建golang环境 二、Jar包加密 &#xff08;一&#xff09;、环境配置 &#xff08;1&#xff09;Linux &#xff08;1&#xff09;下载Go语言二进制包 &#xff08;2&#xff09;解压缩到/usr/local目录 &#xff08;3&#xff09;设置环境变量 &#x…

vue3,pinia状态管理,手写插件实现持久化

状态管理和持久化 先简单概述一下状态管理和持久化 状态管理&#xff1a;使任意两个组件共享数据持久化&#xff1a;将共享的数据保存在本地&#xff0c;不随页面销毁而消失 要实现状态的持久化&#xff0c;可以直接采用插件的形式实现&#xff0c;插件其实就是一个函数&#…

【多通道卷积终结篇,通俗易懂,清晰必读】

作为常识&#xff0c; 1、卷积层 输出特征图通道数 卷积核个数 与输入特征图通道数无关&#xff0c; 2、多卷积核处理多通道特征图的机制过程如下&#xff1a; 本文的参考资料为知乎&#xff1a;一文读懂Faster RCNN。 对于多通道图像多卷积核做卷积&#xff0c;计算方式如…

Java 编程语言:过去、现在与未来

引言 自 1995 年由 Sun Microsystems 发布以来&#xff0c;Java 编程语言已经走过了漫长的道路。作为一种面向对象的编程语言&#xff0c;Java 因其“一次编写&#xff0c;到处运行”的理念而广受欢迎。本文将探讨 Java 的历史、主要特点、应用领域以及未来的发展趋势。 Java…

使用 Mac 数据恢复从 iPhoto 图库中恢复照片

我们每个人都会遇到这种情况&#xff1a;在意识到我们不想丢失照片之前&#xff0c;我们会永久删除 iPhoto 图库中的一些照片。永久删除这些照片后&#xff0c;是否可以从 iPhoto 图库中恢复照片&#xff1f;本文将指导您使用免费的 Mac 数据恢复软件从 iPhoto 中恢复照片。 i…

【漏洞复现】锐捷统一上网行为管理与审计系统——远程命令执行漏洞

声明&#xff1a;本文档或演示材料仅供教育和教学目的使用&#xff0c;任何个人或组织使用本文档中的信息进行非法活动&#xff0c;均与本文档的作者或发布者无关。 文章目录 漏洞描述漏洞复现测试工具 漏洞描述 锐捷统一上网行为管理与审计系统naborTable/static_convert.php…

AIGC遇上ChatGPT,互联网公司的创意设计师,还能做什么?

随着科技的日新月异&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;和ChatGPT等AI技术的涌现&#xff0c;为互联网公司的创意设计师们描绘了一幅充满挑战与机遇的新图景。在这个数字化、智能化的新时代&#xff0c;创意设计师们不仅要保持敏锐的审美眼光和源源不断的…

梅雨季,祛湿不健脾,湿气易反复!4个方法助您健脾胃,祛湿气!

进入梅雨季以来&#xff0c;苏州连续降雨&#xff0c;空气湿度增加&#xff0c;我们身体内的湿气也愈加严重&#xff1a;身上胖嘟嘟、脸上油乎乎、身体困重、乏力&#xff0c;极易疲劳&#xff0c;食欲减退&#xff0c;头昏昏沉沉的&#xff0c;大便也十分黏腻…… 关于祛湿&am…

东昂科技从创业板改道北交所:大客户依赖症明显,巨额分红又募投补流

《港湾商业观察》施子夫 黄懿 2024年6月24日&#xff0c;厦门东昂科技股份有限公司&#xff08;以下简称&#xff0c;东昂科技&#xff09;在北交所网站披露第二轮审核问询函的回复。自2024年1月IPO申请获北交所受理以来&#xff0c;东昂科技已经收到北交所下发的两轮审核问询…

使用官方新工具手动升级 Quest 操作系统

Meta 近期推出了一款用于手动升级 Meta Quest 系统的工具&#xff0c;为用户提供了更多选择。本文将详细介绍如何使用这一工具进行系统升级。 优势与劣势 优势&#xff1a; 安装迅速&#xff1a;升级速度相比在线自动升级快&#xff0c;且可实时查看进度 即时升级&#xff1…