canvas 圆角矩形填充_一篇文章让你学会你最“害怕”的Canvas,太有意思了

Canvas画布
基本用法

<canvas id='canvas' width="150" height="150"></canvas> 

<canvas>看起来跟img标签有点像,唯一不同的是它没有src属性和alt属性。实际上,canvas标签只有两个属性:widthheight
如果没有设置宽度和高度,默认的canvas会初始化width:300px,height:150px

渲染上下文对象

canvas标签创造了一个固定大小的画布,它有一个或者多个渲染上下文对象,用它可以绘制和处理要展示的内容。接下来我们把注意力放在2D渲染上下文中。
canvas起初是空白的。为了展示,首先脚本需要找到渲染上下文,然后在它的上面绘制。canvas元素有一个叫做 getContext()的方法,这个方法是用来获得渲染上下文和它的绘画功能。getContext()只有一个参数,上下文的格式。

var canvas = document.getElementById('myCanvas');//获取绘画上下文对象
var ctx = canvas.getContext('2d'); 

打印结果:

4bbebcc4c0ed9157d9ab292c59d1d3b7.png


绘制形状

在这里你将学会如何绘制矩形、三角形、直线、圆弧和曲线。如果想绘制比较复杂的图形,我们需要掌握路径。

栅格(了解)

861247b6483808bb7f87a3dbe16a9e11.png

绘制矩形常用API

绘制一个填充的矩形

fillRect(x,y,width,height);

绘制一个矩形的边框

strokeRect(x, y, width, height) 

清除指定矩形区域,让清除部分完全透明。

 clearRect(x, y, width, height) 

上面提供的方法之中每个都包含了相同的参数。x和y指定了canvas画布上所绘制的矩形的左上角(相对于原点)的坐标。width和height设置矩形的尺寸。

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');ctx.fillRect(25, 25, 100, 100);ctx.clearRect(45, 45, 60, 60);ctx.strokeRect(50, 50, 50, 50);</script></body>
</html>

效果显示:

0efc09feb0c20a7860bab211e68c332c.png

填充颜色和描边颜色设置

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = 'red';//填充颜色
ctx.strokeStyle = 'green';//描边颜色

使用路径绘制图形
图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。一个路径,甚至一个子路径,都是闭合的。使用路径绘制图形我们需要做以下几步。

  1. 创建路径起始点
  2. 使用画布的各种方法划出路径
  3. 然后把路径封闭
  4. 一旦路径生成,你就能通过描边或填充路径区域来渲染图形

绘制路径常用api
beginPath()

新建一条路径,生成之后,图形绘制api被指向到路径上生成路径。无参数

closePath()

闭合路径之后图形绘制api又重新指向了上下文中

stroke()

 通过线条来绘制图形轮廓

fill()

通过填充路径的内容区域生成实心的图形

moveTo(x,y)

:将画笔移动到指定的坐标x以及y上

当canvas初始化或者beginPath()调用后,你通常会使用moveTo()函数设置起点。我们也能够使用moveTo()绘制一些不连续的路径

lineTo(x,y)

:绘制直线,绘制一条从当前位置到指定x以及y位置的直线

该方法有两个参数:x以及y ,代表坐标系中直线结束的点。开始点和之前的绘制路径有关,之前路径的结束点就是接下来的开始点,等等。。。开始点也可以通过moveTo()函数改变。

看个例子:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');// 填充三角形ctx.beginPath();ctx.moveTo(25, 25);ctx.lineTo(105, 25);ctx.lineTo(25, 105);ctx.fill();// 描边三角形ctx.beginPath();ctx.moveTo(125, 125);ctx.lineTo(125, 45);ctx.lineTo(45, 125);ctx.closePath();ctx.stroke();</script></body>
</html>

效果展示:

2b8c79b2518b4b9d23f970340c298228.png

arc()

绘制圆弧或者圆

arc(x,y,radius,startAngle,endAngle,anticlockwise);

圆心在 (x, y) 位置,半径为 radius ,根据anticlockwise (默认为顺时针)指定的方向从 startAngle 开始绘制,到 endAngle 结束。
anticlockwise:可选的,布尔值,如果为true,逆时针绘制圆弧,反之,顺时针绘制笑脸例子

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');ctx.beginPath();ctx.arc(75, 75, 50, 0, Math.PI * 2, true); // 绘制ctx.moveTo(110, 75);ctx.arc(75, 75, 35, 0, Math.PI, false); // 口(顺时针)ctx.moveTo(65, 65);ctx.arc(60, 65, 5, 0, Math.PI * 2, true); // 左眼ctx.moveTo(95, 65);ctx.arc(90, 65, 5, 0, Math.PI * 2, true); // 右眼ctx.stroke();</script></body>
</html>

效果展示:

b3182455a838b17b240c0507afb1c37d.png

quadraticCurveTo(cp1x,cp1y,x,y)

绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点。

看图:

a2eb46a6e24ae2f4edf89c4cc277ebe4.png

参数x、y在两个方法中都是结束点坐标。cp1x,cp1y为坐标的第一个控制点(上图中的红色点),cp2x,cp2y为坐标中的第二个控制点

二次贝赛尔曲线绘制对话气泡

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="myCanvas" width="300" height="300" style="border:1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('myCanvas');var ctx = canvas.getContext('2d');ctx.beginPath();ctx.moveTo(75, 25);ctx.quadraticCurveTo(25, 25, 25, 62.5);ctx.quadraticCurveTo(25, 100, 50, 100);ctx.quadraticCurveTo(50, 120, 30, 125);ctx.quadraticCurveTo(60, 120, 65, 100);ctx.quadraticCurveTo(125, 100, 125, 62.5);ctx.quadraticCurveTo(125, 25, 75, 25);ctx.stroke();</script></body>
</html>

三次贝塞尔曲线绘制

//三次贝塞尔曲线 
ctx.beginPath(); 
ctx.moveTo(75,40); 
ctx.bezierCurveTo(75,37,70,25,50,25); 
ctx.bezierCurveTo(20,25,20,62.5,20,62.5); ctx.bezierCurveTo(20,80,40,102,75,120); ctx.bezierCurveTo(110,102,130,80,130,62.5); ctx.bezierCurveTo(130,62.5,130,25,100,25); 
ctx.bezierCurveTo(85,25,75,37,75,40); ctx.fill();

效果展示:

9ec02364afd7e580f871a418ddeece79.png

rect(x,y,width,height)

绘制矩形
注意:当你调用fill()函数时,所有没有闭合的形状都会自动闭合,所以你需要调用closePath()函数。但是调用stroke()时不会自动闭包

样式和颜色

  • fillStyle = color:设置图形的填充颜色
  • strokeStyle = color: 设置图形边框的颜色
  • globalAlpha :设置透明度值,取值范围为0~1之间的数值
  • lineWidth = value:设置线条宽度,数值无单位
  • lineCap = type 设置线段末端的样式
    • type:butt 默认值,方形
    • type:round 圆形
    • type:square 以方形结束,但是增加一个宽度和线段相同,宽度是线段宽度一半的矩形区域
  • lineJoin = type:设定线条和线条连接的样式
    • type:round 通过填充一个额外的,圆心在相连部分末端的扇形,绘制拐角的形状。 圆角的半径是线段的宽度。
    • type:bevel 在相连部分的末端填充一个额外的以三角形为底的区域, 每个部分都有各自独立的矩形拐角。
    • type: miter 通过延伸相连部分的外边缘,使其相交于一点,形成一个额外的菱形区域

绘制文本
canvas提供了两种方法来渲染文本

filleText(text,x,y,[,maxWidth])

在指定的(x,y)位置填充指定的文本,绘制的最大宽度是可选的strokeText(text,x,y,[,maxWidth])

在指定的(x,y)位置绘制文本边框,绘制的最大宽度是可选的

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="500" height="200" style="border: 1px solid #666;"></canvas><script type="text/javascript">var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');// 设置字体大小和字体ctx.font = '30px 微软雅黑';ctx.fillText('hello world',50,50);ctx.strokeText('hello world',50,80);</script></body>
</html>

效果:

b1cda19aa197663a6c060e9be0a33644.png

有样式的文本

  • font = value

当前我们用来绘制文本的样式. 这个字符串使用和 CSS font属性相同的语法. 默认的字体是 10px sans-serif

  • textAlign = value

文本对齐选项. 可选的值包括:start, end, left, right or center. 默认值是 start

  • textBaseline = value

基线对齐选项. 可选的值包括:top, hanging, middle, alphabetic, ideographic, bottom。默认值是 alphabetic。

  • direction = value

文本方向。可能的值包括:ltr, rtl, inherit。默认值是 inherit。

使用图片
canvas更有意思的一项特性就是图像操作能力。可以用于动态的图像合成或者作为图形的背景,以及游戏界面(Sprites)等等。浏览器支持的任意格式的外部图片都可以使用,比如PNG、GIF或者JPEG。 你甚至可以将同一个页面中其他canvas元素生成的图片作为图片源。
引入图像到canvas里需要以下两步基本操作:

  1. 获得一个指向HTMLImageElement的对象或者另一个canvas元素的引用作为源,也可以通过提供一个URL的方式来使用图片
  2. 使用drawImage()函数将图片绘制到画布上

核心方法

drawImage(imgObj,x,y,width,height,dx,dy,dWith,dHeight)
其中imgObj是image或者canvas对象,x和y是在canvas里的起始坐标。后面两个参数是可选的,默认是当前画布设置的大小。这两个参数用来控制当前canvas缩放的大小。
如果是8个参数,用来控制做切片显示,前四个参数是定义图像源后的切片位置和大小,后四个参数是定义切片的目标显示的位置和大小

eeda387e24c5fb62bec6262cac8257f9.png

例子:一个简单的线图

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="500" height="500"></canvas><script type="text/javascript">var ctx = document.getElementById('canvas').getContext('2d');var img = new Image();img.onload = function() {ctx.drawImage(img, 0, 0);ctx.beginPath();ctx.moveTo(123, 400);ctx.lineTo(198, 350);ctx.lineTo(300, 200);ctx.lineTo(500, 150);ctx.stroke();}img.src = 'image-20190703114102416.png';</script></body>
</html>

效果展示:

99d00a6de686700742c673e02a211077.png

状态的保存和恢复

save()

保存画布的所有状态

restore()

save和restore方法是用来保存和恢复canvas状态的。都没有参数。

栗子:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="200" height="200"></canvas><script type="text/javascript">function draw(){var ctx = document.getElementById('canvas').getContext('2d');ctx.fillRect(0,0,150,150);//默认绘制一个矩形ctx.save();//保存当前状态ctx.fillStyle = 'red'; //在原有配置基础上对颜色发生改变ctx.fillRect(15,15,120,120);ctx.save();//保存当前状态ctx.fillStyle = 'green'; //再次改变颜色ctx.globalAlpha = 0.5; //改变透明度ctx.fillRect(30,30,90,90);//使用新的配置绘制一个矩形ctx.restore(); //重载之前的颜色状态 (红色)ctx.fillRect(45,45,60,60); //使用上一次的配置绘制一个矩形ctx.restore(); //加载默认的颜色配置ctx.fillRect(60,60,30,30); //使用默认配置绘制矩形}draw();</script></body>
</html>

效果展示:

e0d50a393936339c823baab2836d7e07.png

移动translate

translate(x,y)

translate方法接收两个参数。x是左右偏移量,y是上下偏移量。在做变形之前先保存状态是良好的一个习惯

栗子

function draw() {var ctx = document.getElementById('canvas').getContext('2d');for (var i = 0; i < 3; i++) {for (var j = 0; j < 3; j++) {ctx.save();ctx.fillStyle = 'rgb(' + (51 * i) + ', ' + (255 - 51 * i) + ', 255)';ctx.translate(10 + j * 50, 10 + i * 50);ctx.fillRect(0, 0, 25, 25);ctx.restore();}}
}

效果:

3864506a94c5b067a3459d13b223ae42.png


旋转rotate(angle)
只接受一个参数:选装的角度。顺时针方向
基本动画
如何通过canvas来制作动画呢?
步骤:

  1. 清空canvas
    通过clearReact()来清空canvas,保证自己的画布是干净的
  2. 保存canvas状态
  3. 绘制动画图形
  4. 恢复canvas状态

操控动画的方法setInterval(functuon,delay)
在设定好间隔时间后,function会定期执行setTimeout(function,delay)
在设定好的时间之后执行函数requestAnimationFrame(callback)
此方法一般每秒钟回到函数执行60次。告诉浏览器你希望执行一个动画,并在重绘之前,请求浏览器执行一个特定的函数来更新动画。做三个案例效果1.太阳系动画

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canva" width="500" height="500"></canvas><script type="text/javascript">window.onload = function() {var sun = new Image();var moon = new Image();var earth = new Image();/* 初始化方法 */function init() {sun.src = "sun.png";moon.src = "moon.png";earth.src = "earth.png";window.requestAnimationFrame(draw);}function draw() {// 1.获取上下文var ctx = document.getElementById('canva').getContext('2d');ctx.globalCompositeOperation = 'destination-over';// 2.清空canvasctx.clearRect(0, 0, 500, 500);// 3.设置背景填充色和边框色ctx.fillStyle = "rgba(0,0,0,0.4)";ctx.strokeStyle = "rgba(0,153,255,0.4)";// 4.保存状态ctx.save();// 5.设置位移ctx.translate(150, 150);// 6.地球var time = new Date();// 6.1 地球选装ctx.rotate(((2 * Math.PI) / 60) * time.getSeconds() + ((2 * Math.PI) / 60000) * time.getMilliseconds());// 6.2 地球位移ctx.translate(105, 0);// 6.3 填充图形ctx.fillRect(0, -12, 50, 24); // Shadowctx.drawImage(earth, -12, -12);// Moonctx.save();ctx.rotate(((2 * Math.PI) / 6) * time.getSeconds() + ((2 * Math.PI) / 6000) * time.getMilliseconds());ctx.translate(0, 28.5);ctx.drawImage(moon,-2.5,-2.5);ctx.restore();ctx.restore();//恢复到初始的状态// 开始画圆ctx.beginPath();// 画圆ctx.arc(150, 150, 105, 0, Math.PI * 2, false); // Earth orbit// 描边ctx.stroke();ctx.drawImage(sun, 0, 0, 300, 300);window.requestAnimationFrame(draw);}init();}</script></body>
</html>

效果展示:

16b1fd4ca8669635017196864e43c478.png

高级动画

制作高级动画小球

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><canvas id="canvas" width="600" height="300" style="border: 1px solid #000000;"></canvas><script type="text/javascript">var canvas = document.getElementById('canvas');var ctx = canvas.getContext('2d');var raf;var running = false;var ball = {x: 100, //x坐标y: 100, //y坐标vx: 5, //x轴方向步伐vy: 2, //y轴方向步伐radius: 25, //半径color: 'blue', //颜色drawBall: drawBall // 画的动作}// 画球的方法function drawBall() {ctx.beginPath();ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, true);ctx.closePath();ctx.fillStyle = this.color;ctx.fill();}function clear() {ctx.fillStyle = 'rgb(255,255,255,0.3)';ctx.fillRect(0, 0, canvas.width, canvas.height);}function draw() {clear();// 之前用clearReact()方法来清除前一帧动画,换成filleReact()方法来实现长尾效果// ctx.clearRect(0, 0, canvas.width, canvas.height);ball.drawBall();ball.x += ball.vx;ball.y += ball.vy;// 处理边界if (ball.y + ball.vy > canvas.height || ball.y + ball.vy < 0) {ball.vy = -ball.vy;}if (ball.x + ball.vx > canvas.width || ball.x + ball.vx < 0) {ball.vx = -ball.vx;}raf = window.requestAnimationFrame(draw);}// canvas.addEventListener('mouseover', function() {//     raf = window.requestAnimationFrame(draw);// });canvas.addEventListener('mousemove', function(e) {if(!running){clear();ball.x = e.clientX;ball.y = e.clientY;ball.drawBall();}});canvas.addEventListener('click', function() {if(!running){window.requestAnimationFrame(draw);running = true;}});canvas.addEventListener('mouseout', function() {window.cancelAnimationFrame(raf);running = false;});ball.drawBall();</script></body>
</html>

效果显示:

e537d0e077216648d6b59ab5f4d45aab.png

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:

  1. 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  2. 私信后台回复【前端】有惊喜!
  3. 同时可以期待后续文章ing

我这里有前端进阶架构vip学习资料,包含内容有:HTML、css3、JavaScript、Vue,移动端web开发,Ajax、jQuery、canvas、等多个知识点。需要获取这些内容的朋友可以私信回复我“前端”两个字领取

e28416ff19b848cc4dcb961d3de109de.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过流而不是列表

开幕式免责声明&#xff1a;这并不总是一个好主意。 我将介绍这个主意&#xff0c;以及为什么它是一个好主意的一些原因&#xff0c;但随后我将讨论一些不太理想的实例。 懒惰 如您所知&#xff0c;我在Python中涉猎的程度几乎与在Java中一样。 我一发现Python就很喜欢生成器。…

react-infinite-scroll-component 第二次加载无法触发next

react-infinite-scroll-component 是一款滚动加载插件&#xff0c;在页面滚动的时候加载数据&#xff0c;在使用过程遇到一个坑。 坑的描述&#xff1a; 在页面滚动的时候&#xff0c;infiniteScroll页面数是自动1,打个比方说&#xff0c;页面加载到第三页&#xff0c;infinit…

linux查看文件大小和查看磁盘使用情况

1、df -h 显示目前所有文件系统的可利用空间及和使用情况。参数 -h表示人类可以看懂的格式输出 2、du -h --max-depth1 目录 查询指定文件夹下各个文件夹或文件的大小 3、du -sh test/ 或 du -sm * |sort -n 查看文件目录的大小和数量&#xff0c;并且可以按大小排序 du和df的…

abaqus单位_ANSYS和ABAQUS哪个好,一个例子告诉你

分别用ANSYS和ABAQUS来分析同一个题目并考察其异同点。【问题】一根悬臂梁&#xff0c;长200mm,截面是30mm*20mm的矩形(高度方向是20mm)。该梁左端固定&#xff0c;在其上面施加向下的分布力系&#xff0c;载荷集度是0.6Mpa.已知材料使用低碳钢&#xff0c;弹性模量是200GPA&am…

electron nodejs上传文件获取文件流

使用antd upload组件&#xff0c;electron中ipcRenderer.invoke无法传递文件流&#xff1b; 传文件路径过去&#xff0c;然后使用nodejs获取文件流 // 创建数据流const readerStream fs.createReadStream(path)const formData new FormData()formData.append("file_name…

使用junit做其他事情

junit&#xff01;单元测试 Junit是Java单元测试框架。 通常&#xff0c;我们将其用于单元测试&#xff0c;但是很多时候我们也使用它来执行集成测试。 主要区别在于&#xff0c;单元测试可测试单个单元&#xff0c;而集成测试则可测试不同类如何协同工作。 这样&#xff0c;集…

转行python能拿到多少钱_想转行学python过来人提醒大家几点

因为目前python非常火&#xff0c;应用也非常广泛&#xff0c;是目前最火的行业之一&#xff0c;竞争很大&#xff0c;工资很高&#xff0c;未来发展也极好。Python 现在到底有多热呢&#xff1f;我觉得我们可以看以下的这2组数据。第一&#xff1a;Python 排名稳居前五得益于 …

纯前端 导出excel 插件xlsx和file-saver

使用插件 xlsx 导出表格&#xff0c;file-saver保存文件 vue-element-admin,源码中找的&#xff1b;导出上万条数据还是很快的 gitHub地址,/vendor/Export2Excel的js文件 使用方法 export_json_to_excel({header: res.header,data: res.exportData,filename: ${fileName}1-$…

用Java创建自己的AOP

介绍 如您所知&#xff0c;AOP是Spring框架提供的最好的功能之一&#xff0c;它在实现跨领域关注的同时提供了最大的灵活性。 您是否想到过AOP在Spring如何工作&#xff1f; 有时这是高级技术面试时要问的问题。 有时&#xff0c;仅涉及核心Java时&#xff0c;这个问题变得更加…

linux中常用的头文件

#include <linux/***.h> 是在linux-2.6.29/include/linux下面寻找源文件。 #include <asm/***.h> 是在linux-2.6.29/arch/arm/include/asm下面寻找源文件。 #include <mach/***.h> 是在linux-2.6.29/arch/arm/mach-s3c2410/include/mach下面寻找源文件。 #in…

java的文本框如何回车键触发按钮_java回车触发按钮的代码

使用的时候&#xff0c;只要将SwingUtils .enterPressesWhenFocused(JButton)这样就可以实现回车时候&#xff0c;触发按钮。另外文本输入框回车触发事件则是&#xff1a;SwingUtils .enterPressesWhenFocused(JTextField textField,ActionListener actionListener) 。其中acti…

Typescript Interface 覆盖继承的接口定义

type Merge<M, N> Omit<M, Extract<keyof M, keyof N>> & N;使用方式 interface A {name: string;color?: string; } type B Merge<A, {name: string | number;favorite?: boolean; }>;参考地址

JBoss Fuse –一些鲜为人知的技巧

TL; DR 将Java静态调用公开为Karaf Shell本机命令 在部署时覆盖OSGi标头 在使用OSGi片段部署时间后覆盖OSGi标头 将Java静态调用公开为Karaf Shell本机命令 作为必须与支持人员和客户进行协作的软件工程师的一部分&#xff0c;我经常发现自己需要从无法访问的系统中提取其他…

cocos2d-x学习笔记之图片分辨率适配

从wiki里面看到&#xff0c;新的版本是去掉了enabelRetinaDisplay&#xff0c;因为要兼容iosandroid&#xff0c;其他平台是否也是如此&#xff0c;未知&#xff5e; 测试代码 std::vector<std::string> resDirOrders; resDirOrders.push_back("testImage2"…

vue 外部方法调用内部_vue函数内部调用外部函数,报错外部函数不是函数

zeroFill (num,len,radix) {let str num.toString(radix || 10);while (str.length < len) {str 0 str;}return str;},initMap() {console.log(this.zeroFill(50, 8, 16))//底图图层数据源var googleDXSource new XYZ({tileUrlFunction: function (coor) {console.log(c…

electron+react 用户自定义安装路径

使用electron-builder打包electron项目&#xff0c;其中Windows提供了NSIS来自定义安装程序。 在主进程的package.json文件中添加一些配置 "scripts":{},"build": {"directories": {"output": "release"},"nsis":…

模型微调入门介绍一

备注&#xff1a;模型微调系列的博客部分内容来源于极客时间大模型微调训练营素材&#xff0c;撰写模型微调一系列博客&#xff0c;主要是期望把训练营的内容内化成自己的知识&#xff0c;我自己写的这一系列博客除了采纳部分训练营的内容外&#xff0c;还会扩展细化某些具体细…

JMH:如何设置和运行JMH基准

健康警告&#xff01; 这篇文章描述了如何设置和运行简单的JMH基准测试。 众所周知&#xff0c;微基准测试很难正确设置&#xff0c;即使您确实正确设置了&#xff08;通过使用JMH之类的工具&#xff09;&#xff0c;它们仍然会产生误导。 仅仅因为您的代码在极端孤立的人为情况…

npp夜光数据介绍 viirs_科研成果快报第177期:中国地区长时序AVHRR气溶胶数据的主要问题: 气溶胶反演频次与重污染天气...

中国地区长时序AVHRR气溶胶数据的主要问题&#xff1a;气溶胶反演频次与重污染天气A critical view of long-term AVHRR aerosol data record in China: Retrieval frequency and heavy pollution成果信息Minghui Tao, Rong Li, Lili Wang et al. (2020)A critical view of lon…

使用Eclipse创建一个Android程序方法

要编写Android程序&#xff0c;需要安装JDK、Eclipse和Android SDK。 Android SDK的安装路径不要在program file或program file(x86)下&#xff0c;否则在debug时会碰很奇怪的问题。最好直接放在C:\Android下。&#xff08;如果非要放在Program files下也可以&#xff0c;在ecl…