马黑黑 发表于 2024-3-27 12:06

用canvas画布制作首尾衔接图片源码

本帖最后由 马黑黑 于 2024-3-27 13:37 编辑 <br /><br /><style>
.mum { position: relative; margin: 0; padding: 10px; font: normal 16px/20px Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; color: black; background: rgba(240, 240, 240,.95); box-shadow: 2px 2px 4px gray; border: thick groove lightblue; border-radius: 6px; }
.mum ::selection { background-color: rgba(0,100,100,.35); }
.mum div { margin: 0; padding: 0; }
.mum cl-cd { display: block; position: relative; margin: 0 0 0 50px; padding: 0 0 0 10px; white-space: pre-wrap; overflow-wrap: break-word; border-left: 1px solid silver; }
.mum cl-cd::before { position: absolute; content: attr(data-idx); width: 50px; color: gray; text-align: right; transform: translate(-70px); }
.tRed { color: red; }
.tBlue { color: blue; }
.tGreen { color: green; }
.tDarkRed { color: darkred; }
.tMagenta { color: magenta; }
</style>
<div class='mum'>
<cl-cd data-idx="1">&lt;!DOCTYPE html&gt;</cl-cd>
<cl-cd data-idx="2">&lt;<span class="tDarkRed">html</span> lang=<span class="tMagenta">"zh"</span>&gt;</cl-cd>
<cl-cd data-idx="3">&lt;<span class="tDarkRed">head</span>&gt;</cl-cd>
<cl-cd data-idx="4">&lt;<span class="tDarkRed">meta</span> charset=<span class="tMagenta">"utf-8"</span> /&gt;</cl-cd>
<cl-cd data-idx="5">&lt;<span class="tDarkRed">title</span>&gt;首尾衔接图片制作&lt;<span class="tDarkRed">/title</span>&gt;</cl-cd>
<cl-cd data-idx="6">&lt;<span class="tDarkRed">/head</span>&gt;</cl-cd>
<cl-cd data-idx="7">&lt;<span class="tDarkRed">body</span>&gt;</cl-cd>
<cl-cd data-idx="8">&nbsp;</cl-cd>
<cl-cd data-idx="9">&lt;<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"papa"</span> style=<span class="tMagenta">"<span class="tBlue">margin-top:</span>20px;<span class="tBlue">text-align:</span>center;"</span>&gt;&lt;<span class="tDarkRed">/div</span>&gt;</cl-cd>
<cl-cd data-idx="10">&nbsp;</cl-cd>
<cl-cd data-idx="11">&lt;<span class="tDarkRed">script</span>&gt;</cl-cd>
<cl-cd data-idx="12">&nbsp;</cl-cd>
<cl-cd data-idx="13"><span class="tBlue">let</span> oImg = <span class="tBlue">new</span> Image(); <span class="tGreen">/* 创建 Image 对象 */</span></cl-cd>
<cl-cd data-idx="14">&nbsp;</cl-cd>
<cl-cd data-idx="15"><span class="tGreen">/* 图片加载事件 :加载完毕运行花括号内的代码 */</span></cl-cd>
<cl-cd data-idx="16">oImg.onload = () =&gt; {</cl-cd>
<cl-cd data-idx="17">&nbsp; &nbsp; <span class="tGreen">/* 创建 canvas 画布 */</span></cl-cd>
<cl-cd data-idx="18">&nbsp; &nbsp; <span class="tBlue">let</span> canv = <span class="tRed">document</span>.createElement(<span class="tMagenta">'canvas'</span>);</cl-cd>
<cl-cd data-idx="19">&nbsp; &nbsp; canv.style.border = <span class="tMagenta">'1px solid gray'</span>;</cl-cd>
<cl-cd data-idx="20">&nbsp; &nbsp; <span class="tBlue">let</span> ww = canv.width = oImg.width * 2; <span class="tGreen">/* 画布宽为图片的两倍 */</span></cl-cd>
<cl-cd data-idx="21">&nbsp; &nbsp; <span class="tBlue">let</span> hh = canv.height = oImg.height; <span class="tGreen">/* 画布高度和图片一致 */</span></cl-cd>
<cl-cd data-idx="22">&nbsp; &nbsp; console.log(ww);</cl-cd>
<cl-cd data-idx="23">&nbsp; &nbsp; papa.appendChild(canv); <span class="tGreen">/* 画布追加到 <span class="tRed">id</span>=<span class="tMagenta">"papa"</span> 元素 */</span></cl-cd>
<cl-cd data-idx="24">&nbsp; &nbsp; <span class="tBlue">let</span> ctx = canv.getContext(<span class="tMagenta">'2d'</span>); <span class="tGreen">/* 取得画笔 */</span></cl-cd>
<cl-cd data-idx="25">&nbsp; &nbsp; <span class="tGreen">/* 第一次绘制图片 :左半边 */</span></cl-cd>
<cl-cd data-idx="26">&nbsp; &nbsp; ctx.drawImage(oImg, 0, 0, ww / 2, hh, 0, 0, ww / 2, hh);</cl-cd>
<cl-cd data-idx="27">&nbsp; &nbsp; ctx.save(); <span class="tGreen">/* 保存画布状态 */</span></cl-cd>
<cl-cd data-idx="28">&nbsp; &nbsp; ctx.translate(ww, 0); <span class="tGreen">/* 移动画布坐标系到X方向末端 ,Y方向不变 */</span></cl-cd>
<cl-cd data-idx="29">&nbsp; &nbsp; ctx.scale(-1, 1); <span class="tGreen">/* 左右逆转画布坐标系 */</span></cl-cd>
<cl-cd data-idx="30">&nbsp; &nbsp; <span class="tGreen">/* 第二次绘制图片 :右半边 */</span></cl-cd>
<cl-cd data-idx="31">&nbsp; &nbsp; ctx.drawImage(oImg, 0, 0, ww / 2, hh, 0, 0, ww / 2, hh);</cl-cd>
<cl-cd data-idx="32">&nbsp; &nbsp; ctx.restore(); <span class="tGreen">/* 还原画布状态 */</span></cl-cd>
<cl-cd data-idx="33">};</cl-cd>
<cl-cd data-idx="34">&nbsp;</cl-cd>
<cl-cd data-idx="35"><span class="tGreen">/* 图片地址 :本地运行可以是本地图片 */</span></cl-cd>
<cl-cd data-idx="36">oImg.src = <span class="tMagenta">'https://638183.freep.cn/638183/Pic/fj2.jpg'</span>;</cl-cd>
<cl-cd data-idx="37">&nbsp;</cl-cd>
<cl-cd data-idx="38">&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
<cl-cd data-idx="39">&nbsp;</cl-cd>
<div class="tGreen"><cl-cd data-idx="40">&lt;!--</cl-cd>
<cl-cd data-idx="41">&nbsp;</cl-cd>
<cl-cd data-idx="42">【附】drawImage() 方法使用说明</cl-cd>
<cl-cd data-idx="43">&nbsp;</cl-cd>
<cl-cd data-idx="44">第一种方法:需要三个参数(假如 ctx 为画笔操作对象,后同)</cl-cd>
<cl-cd data-idx="45">&nbsp;</cl-cd>
<cl-cd data-idx="46">&nbsp; &nbsp; ctx.drawImage(img, dx, dy);</cl-cd>
<cl-cd data-idx="47">&nbsp;</cl-cd>
<cl-cd data-idx="48">参数解释:</cl-cd>
<cl-cd data-idx="49">&nbsp;</cl-cd>
<cl-cd data-idx="50">&nbsp; &nbsp; ① img&nbsp;: 图形对象,如 img 标签、<span class="tBlue">new</span> Image() 对象、video 标签、另一个 canvas 对象等;</cl-cd>
<cl-cd data-idx="51">&nbsp; &nbsp; ② dx&nbsp;: 在画布上放置图形的水平方向起始位置(d 为目标,destination 的缩写,目标指绘制到哪儿)</cl-cd>
<cl-cd data-idx="52">&nbsp; &nbsp; ③ dy&nbsp;: 在画布上放置图形的垂直方向起始位置</cl-cd>
<cl-cd data-idx="53">&nbsp;</cl-cd>
<cl-cd data-idx="54">此法仅设置开始绘制图形的位置,从该位置开始,带绘制的图片将往右、往下绘制,直至画完图片或画到画布右、下边缘</cl-cd>
<cl-cd data-idx="55">&nbsp;</cl-cd>
<cl-cd data-idx="56">第二种方法:需要五个参数</cl-cd>
<cl-cd data-idx="57">&nbsp;</cl-cd>
<cl-cd data-idx="58">&nbsp; &nbsp; ctx.drawImage(img, dx, dy, dw, dh);</cl-cd>
<cl-cd data-idx="59">&nbsp;</cl-cd>
<cl-cd data-idx="60">参数解释:</cl-cd>
<cl-cd data-idx="61">&nbsp;</cl-cd>
<cl-cd data-idx="62">&nbsp; &nbsp; ① img&nbsp;: 同方法一</cl-cd>
<cl-cd data-idx="63">&nbsp; &nbsp; ② dx&nbsp;: 同方法一</cl-cd>
<cl-cd data-idx="64">&nbsp; &nbsp; ③ dy&nbsp;: 同方法一</cl-cd>
<cl-cd data-idx="65">&nbsp; &nbsp; ④ dw&nbsp;: 在画布上绘制图形的宽度(w 即 width)</cl-cd>
<cl-cd data-idx="66">&nbsp; &nbsp; ⑤ dh&nbsp;: 在画布上绘制图形的高度(h 即 height)</cl-cd>
<cl-cd data-idx="67">&nbsp;</cl-cd>
<cl-cd data-idx="68">此法考虑绘制图形的位置与宽高,图片将在这个尺寸里完整展示,可能存在伸缩</cl-cd>
<cl-cd data-idx="69">&nbsp;</cl-cd>
<cl-cd data-idx="70">第三种方法:需要九个参数</cl-cd>
<cl-cd data-idx="71">&nbsp;</cl-cd>
<cl-cd data-idx="72">&nbsp; &nbsp; ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);</cl-cd>
<cl-cd data-idx="73">&nbsp;</cl-cd>
<cl-cd data-idx="74">参数解释:</cl-cd>
<cl-cd data-idx="75">&nbsp;</cl-cd>
<cl-cd data-idx="76">&nbsp; &nbsp; ① img&nbsp;: 同方法一</cl-cd>
<cl-cd data-idx="77">&nbsp; &nbsp; ② sx&nbsp;: 截取图片水平方向的起始位置(s 是 source 源的缩写,图片源之意)</cl-cd>
<cl-cd data-idx="78">&nbsp; &nbsp; ③ sy&nbsp;: 截取图片垂直方向的起始位置</cl-cd>
<cl-cd data-idx="79">&nbsp; &nbsp; ④ sw&nbsp;: 从 sx 起截取图片的宽度</cl-cd>
<cl-cd data-idx="80">&nbsp; &nbsp; ⑤ sy&nbsp;: 从 sy 其截取图片的高度</cl-cd>
<cl-cd data-idx="81">&nbsp; &nbsp; ⑥ dx&nbsp;: (截取的图片区域)绘制在画布上的水平方向起始位置</cl-cd>
<cl-cd data-idx="82">&nbsp; &nbsp; ⑦ dy&nbsp;: (截取的图片区域)绘制在画布上的垂直方向起始位置</cl-cd>
<cl-cd data-idx="83">&nbsp; &nbsp; ⑧ dw&nbsp;: 在画布上绘制(截取的图片区域)的宽度</cl-cd>
<cl-cd data-idx="84">&nbsp; &nbsp; ⑨ dh&nbsp;: 在画布上绘制(截取的图片区域)的高度度</cl-cd>
<cl-cd data-idx="85">&nbsp;</cl-cd>
<cl-cd data-idx="86">此法既考虑图像源(s*)的裁剪位置和尺寸,又考虑在画布上绘制的位置和绘制宽高(d*),可定制性极强</cl-cd>
<cl-cd data-idx="87">&nbsp;</cl-cd>
<cl-cd data-idx="88">--&gt;</cl-cd></div>
<cl-cd data-idx="89">&nbsp;</cl-cd>
<cl-cd data-idx="90">&lt;<span class="tDarkRed">/body</span>&gt;</cl-cd>
<cl-cd data-idx="91">&lt;<span class="tDarkRed">/html</span>&gt;</cl-cd>
</div>

马黑黑 发表于 2024-3-27 12:11

请将代码复制到文本编辑器(例如记事本),将图片地址替换为自己希望加工的图片,保存为 .html 文档,然后找到该文档双击运行(浏览器注意不要使用 IE 或 IE内核的)。图片地址无误的话,可在浏览器中看到结果。右击图片另存为即可。

朵拉 发表于 2024-3-27 12:11

这是为笨学生编辑的代码么?
我研究下,谢谢老师~~{:4_190:}{:4_204:}

南无月 发表于 2024-3-27 18:12

马黑黑 发表于 2024-3-27 12:11
请将代码复制到文本编辑器(例如记事本),将图片地址替换为自己希望加工的图片,保存为 .html 文档,然后 ...

天哪,原来是这么用的。。另存就可以{:4_170:}这也太方便 了。。

中午还想说怎么整到贴子里去呢。。

南无月 发表于 2024-3-27 18:13

新工具,这段代码得存着。。。{:4_199:}

马黑黑 发表于 2024-3-27 18:23

南无月 发表于 2024-3-27 18:13
新工具,这段代码得存着。。。

偶尔会有点用

马黑黑 发表于 2024-3-27 18:25

南无月 发表于 2024-3-27 18:12
天哪,原来是这么用的。。另存就可以这也太方便 了。。

中午还想说怎么整到贴子里去呢。。

{:4_172:}

canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利,它是不一样的

马黑黑 发表于 2024-3-27 18:25

朵拉 发表于 2024-3-27 12:11
这是为笨学生编辑的代码么?
我研究下,谢谢老师~~

{:4_190:}

红影 发表于 2024-3-27 19:43

这个好,直接把图片对接起来了,还能下载,就便于修改图图了呢{:4_199:}

红影 发表于 2024-3-27 19:44

还以为各取一半,还是700宽,结果成了1400宽,很奇特。
看代码里是取了一半的啊。

樵歌 发表于 2024-3-27 19:54

拿着勺子喂{:4_189:}

马黑黑 发表于 2024-3-27 19:57

红影 发表于 2024-3-27 19:44
还以为各取一半,还是700宽,结果成了1400宽,很奇特。
看代码里是取了一半的啊。

你看第 20 代码

马黑黑 发表于 2024-3-27 19:58

樵歌 发表于 2024-3-27 19:54
拿着勺子喂

吃瓜皮是用左手抓的{:4_170:}

南无月 发表于 2024-3-27 20:05

马黑黑 发表于 2024-3-27 18:23
偶尔会有点用

工具么。有的用得多,有的用得少。。反正都有用。。存库里了。。{:4_173:}

南无月 发表于 2024-3-27 20:10

马黑黑 发表于 2024-3-27 18:25
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利 ...

https://pic.imgdb.cn/item/66040c879f345e8d03aa917f.png

南无月 发表于 2024-3-27 20:11

马黑黑 发表于 2024-3-27 18:25
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利 ...

{:4_170:}
看到了,连视频一起存了。。
想截个显示小天使的,试了三四次都木有。。。
是巧合还是截不上?

南无月 发表于 2024-3-27 20:14

马黑黑 发表于 2024-3-27 18:25
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利 ...

用我站里的胜利试了一下,除了图片啥也截不到。。视频也没有,小天使也没有。。
{:4_170:}

马黑黑 发表于 2024-3-27 20:39

南无月 发表于 2024-3-27 20:14
用我站里的胜利试了一下,除了图片啥也截不到。。视频也没有,小天使也没有。。

你那里一样,视频独立

马黑黑 发表于 2024-3-27 20:40

南无月 发表于 2024-3-27 20:11
看到了,连视频一起存了。。
想截个显示小天使的,试了三四次都木有。。。
是巧合还是截不 ...

小天使截不到的,它是独立的图片,没有加入画布

南无月 发表于 2024-3-27 20:44

马黑黑 发表于 2024-3-27 20:39
你那里一样,视频独立

嗯哪,,我刚才三个全试了。只有你那里能一起截视频{:4_170:}
页: [1] 2 3 4 5
查看完整版本: 用canvas画布制作首尾衔接图片源码