用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"><!DOCTYPE html></cl-cd>
<cl-cd data-idx="2"><<span class="tDarkRed">html</span> lang=<span class="tMagenta">"zh"</span>></cl-cd>
<cl-cd data-idx="3"><<span class="tDarkRed">head</span>></cl-cd>
<cl-cd data-idx="4"><<span class="tDarkRed">meta</span> charset=<span class="tMagenta">"utf-8"</span> /></cl-cd>
<cl-cd data-idx="5"><<span class="tDarkRed">title</span>>首尾衔接图片制作<<span class="tDarkRed">/title</span>></cl-cd>
<cl-cd data-idx="6"><<span class="tDarkRed">/head</span>></cl-cd>
<cl-cd data-idx="7"><<span class="tDarkRed">body</span>></cl-cd>
<cl-cd data-idx="8"> </cl-cd>
<cl-cd data-idx="9"><<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>><<span class="tDarkRed">/div</span>></cl-cd>
<cl-cd data-idx="10"> </cl-cd>
<cl-cd data-idx="11"><<span class="tDarkRed">script</span>></cl-cd>
<cl-cd data-idx="12"> </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"> </cl-cd>
<cl-cd data-idx="15"><span class="tGreen">/* 图片加载事件 :加载完毕运行花括号内的代码 */</span></cl-cd>
<cl-cd data-idx="16">oImg.onload = () => {</cl-cd>
<cl-cd data-idx="17"> <span class="tGreen">/* 创建 canvas 画布 */</span></cl-cd>
<cl-cd data-idx="18"> <span class="tBlue">let</span> canv = <span class="tRed">document</span>.createElement(<span class="tMagenta">'canvas'</span>);</cl-cd>
<cl-cd data-idx="19"> canv.style.border = <span class="tMagenta">'1px solid gray'</span>;</cl-cd>
<cl-cd data-idx="20"> <span class="tBlue">let</span> ww = canv.width = oImg.width * 2; <span class="tGreen">/* 画布宽为图片的两倍 */</span></cl-cd>
<cl-cd data-idx="21"> <span class="tBlue">let</span> hh = canv.height = oImg.height; <span class="tGreen">/* 画布高度和图片一致 */</span></cl-cd>
<cl-cd data-idx="22"> console.log(ww);</cl-cd>
<cl-cd data-idx="23"> papa.appendChild(canv); <span class="tGreen">/* 画布追加到 <span class="tRed">id</span>=<span class="tMagenta">"papa"</span> 元素 */</span></cl-cd>
<cl-cd data-idx="24"> <span class="tBlue">let</span> ctx = canv.getContext(<span class="tMagenta">'2d'</span>); <span class="tGreen">/* 取得画笔 */</span></cl-cd>
<cl-cd data-idx="25"> <span class="tGreen">/* 第一次绘制图片 :左半边 */</span></cl-cd>
<cl-cd data-idx="26"> ctx.drawImage(oImg, 0, 0, ww / 2, hh, 0, 0, ww / 2, hh);</cl-cd>
<cl-cd data-idx="27"> ctx.save(); <span class="tGreen">/* 保存画布状态 */</span></cl-cd>
<cl-cd data-idx="28"> ctx.translate(ww, 0); <span class="tGreen">/* 移动画布坐标系到X方向末端 ,Y方向不变 */</span></cl-cd>
<cl-cd data-idx="29"> ctx.scale(-1, 1); <span class="tGreen">/* 左右逆转画布坐标系 */</span></cl-cd>
<cl-cd data-idx="30"> <span class="tGreen">/* 第二次绘制图片 :右半边 */</span></cl-cd>
<cl-cd data-idx="31"> ctx.drawImage(oImg, 0, 0, ww / 2, hh, 0, 0, ww / 2, hh);</cl-cd>
<cl-cd data-idx="32"> ctx.restore(); <span class="tGreen">/* 还原画布状态 */</span></cl-cd>
<cl-cd data-idx="33">};</cl-cd>
<cl-cd data-idx="34"> </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"> </cl-cd>
<cl-cd data-idx="38"><<span class="tDarkRed">/script</span>></cl-cd>
<cl-cd data-idx="39"> </cl-cd>
<div class="tGreen"><cl-cd data-idx="40"><!--</cl-cd>
<cl-cd data-idx="41"> </cl-cd>
<cl-cd data-idx="42">【附】drawImage() 方法使用说明</cl-cd>
<cl-cd data-idx="43"> </cl-cd>
<cl-cd data-idx="44">第一种方法:需要三个参数(假如 ctx 为画笔操作对象,后同)</cl-cd>
<cl-cd data-idx="45"> </cl-cd>
<cl-cd data-idx="46"> ctx.drawImage(img, dx, dy);</cl-cd>
<cl-cd data-idx="47"> </cl-cd>
<cl-cd data-idx="48">参数解释:</cl-cd>
<cl-cd data-idx="49"> </cl-cd>
<cl-cd data-idx="50"> ① img : 图形对象,如 img 标签、<span class="tBlue">new</span> Image() 对象、video 标签、另一个 canvas 对象等;</cl-cd>
<cl-cd data-idx="51"> ② dx : 在画布上放置图形的水平方向起始位置(d 为目标,destination 的缩写,目标指绘制到哪儿)</cl-cd>
<cl-cd data-idx="52"> ③ dy : 在画布上放置图形的垂直方向起始位置</cl-cd>
<cl-cd data-idx="53"> </cl-cd>
<cl-cd data-idx="54">此法仅设置开始绘制图形的位置,从该位置开始,带绘制的图片将往右、往下绘制,直至画完图片或画到画布右、下边缘</cl-cd>
<cl-cd data-idx="55"> </cl-cd>
<cl-cd data-idx="56">第二种方法:需要五个参数</cl-cd>
<cl-cd data-idx="57"> </cl-cd>
<cl-cd data-idx="58"> ctx.drawImage(img, dx, dy, dw, dh);</cl-cd>
<cl-cd data-idx="59"> </cl-cd>
<cl-cd data-idx="60">参数解释:</cl-cd>
<cl-cd data-idx="61"> </cl-cd>
<cl-cd data-idx="62"> ① img : 同方法一</cl-cd>
<cl-cd data-idx="63"> ② dx : 同方法一</cl-cd>
<cl-cd data-idx="64"> ③ dy : 同方法一</cl-cd>
<cl-cd data-idx="65"> ④ dw : 在画布上绘制图形的宽度(w 即 width)</cl-cd>
<cl-cd data-idx="66"> ⑤ dh : 在画布上绘制图形的高度(h 即 height)</cl-cd>
<cl-cd data-idx="67"> </cl-cd>
<cl-cd data-idx="68">此法考虑绘制图形的位置与宽高,图片将在这个尺寸里完整展示,可能存在伸缩</cl-cd>
<cl-cd data-idx="69"> </cl-cd>
<cl-cd data-idx="70">第三种方法:需要九个参数</cl-cd>
<cl-cd data-idx="71"> </cl-cd>
<cl-cd data-idx="72"> ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);</cl-cd>
<cl-cd data-idx="73"> </cl-cd>
<cl-cd data-idx="74">参数解释:</cl-cd>
<cl-cd data-idx="75"> </cl-cd>
<cl-cd data-idx="76"> ① img : 同方法一</cl-cd>
<cl-cd data-idx="77"> ② sx : 截取图片水平方向的起始位置(s 是 source 源的缩写,图片源之意)</cl-cd>
<cl-cd data-idx="78"> ③ sy : 截取图片垂直方向的起始位置</cl-cd>
<cl-cd data-idx="79"> ④ sw : 从 sx 起截取图片的宽度</cl-cd>
<cl-cd data-idx="80"> ⑤ sy : 从 sy 其截取图片的高度</cl-cd>
<cl-cd data-idx="81"> ⑥ dx : (截取的图片区域)绘制在画布上的水平方向起始位置</cl-cd>
<cl-cd data-idx="82"> ⑦ dy : (截取的图片区域)绘制在画布上的垂直方向起始位置</cl-cd>
<cl-cd data-idx="83"> ⑧ dw : 在画布上绘制(截取的图片区域)的宽度</cl-cd>
<cl-cd data-idx="84"> ⑨ dh : 在画布上绘制(截取的图片区域)的高度度</cl-cd>
<cl-cd data-idx="85"> </cl-cd>
<cl-cd data-idx="86">此法既考虑图像源(s*)的裁剪位置和尺寸,又考虑在画布上绘制的位置和绘制宽高(d*),可定制性极强</cl-cd>
<cl-cd data-idx="87"> </cl-cd>
<cl-cd data-idx="88">--></cl-cd></div>
<cl-cd data-idx="89"> </cl-cd>
<cl-cd data-idx="90"><<span class="tDarkRed">/body</span>></cl-cd>
<cl-cd data-idx="91"><<span class="tDarkRed">/html</span>></cl-cd>
</div> 请将代码复制到文本编辑器(例如记事本),将图片地址替换为自己希望加工的图片,保存为 .html 文档,然后找到该文档双击运行(浏览器注意不要使用 IE 或 IE内核的)。图片地址无误的话,可在浏览器中看到结果。右击图片另存为即可。 这是为笨学生编辑的代码么?
我研究下,谢谢老师~~{:4_190:}{:4_204:} 马黑黑 发表于 2024-3-27 12:11
请将代码复制到文本编辑器(例如记事本),将图片地址替换为自己希望加工的图片,保存为 .html 文档,然后 ...
天哪,原来是这么用的。。另存就可以{:4_170:}这也太方便 了。。
中午还想说怎么整到贴子里去呢。。 新工具,这段代码得存着。。。{:4_199:} 南无月 发表于 2024-3-27 18:13
新工具,这段代码得存着。。。
偶尔会有点用 南无月 发表于 2024-3-27 18:12
天哪,原来是这么用的。。另存就可以这也太方便 了。。
中午还想说怎么整到贴子里去呢。。
{:4_172:}
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利,它是不一样的 朵拉 发表于 2024-3-27 12:11
这是为笨学生编辑的代码么?
我研究下,谢谢老师~~
{:4_190:} 这个好,直接把图片对接起来了,还能下载,就便于修改图图了呢{:4_199:} 还以为各取一半,还是700宽,结果成了1400宽,很奇特。
看代码里是取了一半的啊。 拿着勺子喂{:4_189:} 红影 发表于 2024-3-27 19:44
还以为各取一半,还是700宽,结果成了1400宽,很奇特。
看代码里是取了一半的啊。
你看第 20 代码 樵歌 发表于 2024-3-27 19:54
拿着勺子喂
吃瓜皮是用左手抓的{:4_170:} 马黑黑 发表于 2024-3-27 18:23
偶尔会有点用
工具么。有的用得多,有的用得少。。反正都有用。。存库里了。。{:4_173:} 马黑黑 发表于 2024-3-27 18:25
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利 ...
https://pic.imgdb.cn/item/66040c879f345e8d03aa917f.png 马黑黑 发表于 2024-3-27 18:25
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利 ...
{:4_170:}
看到了,连视频一起存了。。
想截个显示小天使的,试了三四次都木有。。。
是巧合还是截不上? 马黑黑 发表于 2024-3-27 18:25
canvas画布实时画出来的东东都可以右键另存为,包括帖子里的。你可以试一下在我站里的胜利 ...
用我站里的胜利试了一下,除了图片啥也截不到。。视频也没有,小天使也没有。。
{:4_170:} 南无月 发表于 2024-3-27 20:14
用我站里的胜利试了一下,除了图片啥也截不到。。视频也没有,小天使也没有。。
你那里一样,视频独立 南无月 发表于 2024-3-27 20:11
看到了,连视频一起存了。。
想截个显示小天使的,试了三四次都木有。。。
是巧合还是截不 ...
小天使截不到的,它是独立的图片,没有加入画布 马黑黑 发表于 2024-3-27 20:39
你那里一样,视频独立
嗯哪,,我刚才三个全试了。只有你那里能一起截视频{:4_170:}