马黑黑 发表于 2024-4-27 10:31

canvas画布:颗粒化图像

<style>
.wrap { font: normal 18px / 24px sans-serif; }
.wrap p, .wrap div { margin: 20px 0; }
#papa { margin: auto; width: 600px; height: 400px; background: olive; border: 1px solid gray; position: relative;}
.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="wrap">
        <p>先上效果:</p>
        <div id="papa"></div>
        <p>左边的图片被颗粒化了。颗粒化也称粒子化,其实现原理有多重方法,这里使用canvas画布的 getImageData 方法获得图片像素数据,根据图片宽高尺寸纵横遍历像素,以一定的像素间隔获取具体像素数据,然后将这些数据作为绘制圆点的依据在画布上进行重绘。核心代码已经封装成独立的JS资源,引用和配置代码如下:</p>
        <div class='mum'>
<cl-cd data-idx="1">&lt;<span class="tDarkRed">div</span> <span class="tRed">id</span>=<span class="tMagenta">"papa"</span>&gt;&lt;<span class="tDarkRed">/div</span>&gt;</cl-cd>
<cl-cd data-idx="2">&nbsp;</cl-cd>
<cl-cd data-idx="3">&lt;<span class="tDarkRed">script</span>&gt;</cl-cd>
<cl-cd data-idx="4"><span class="tBlue">var</span> sF = <span class="tRed">document</span>.createElement(<span class="tMagenta">'script'</span>);</cl-cd>
<cl-cd data-idx="5">sF.src = <span class="tMagenta">'https://638183.freep.cn/638183/web/js/pic2dot.js'</span>;</cl-cd>
<cl-cd data-idx="6">sF.charset = <span class="tMagenta">'utf-8'</span>;</cl-cd>
<cl-cd data-idx="7"><span class="tRed">document</span>.body.appendChild(sF);</cl-cd>
<cl-cd data-idx="8">&nbsp;</cl-cd>
<cl-cd data-idx="9"><span class="tBlue">var</span> p2d = {</cl-cd>
<cl-cd data-idx="10">&nbsp; &nbsp; <span class="tBlue">papa:</span> <span class="tMagenta">'#papa'</span>,</cl-cd>
<cl-cd data-idx="11">&nbsp; &nbsp; <span class="tBlue">pic:</span> <span class="tMagenta">'https://638183.freep.cn/638183/Pic/38/nb7.jpg'</span>,</cl-cd>
<cl-cd data-idx="12">&nbsp; &nbsp; <span class="tBlue">skip:</span> 4,</cl-cd>
<cl-cd data-idx="13">&nbsp; &nbsp; <span class="tBlue">width:</span> 320,</cl-cd>
<cl-cd data-idx="14">&nbsp; &nbsp; <span class="tBlue">height:</span> 400</cl-cd>
<cl-cd data-idx="15">};</cl-cd>
<cl-cd data-idx="16">&lt;<span class="tDarkRed">/script</span>&gt;</cl-cd>
        </div>

        <p>其中,papa 参数必须,指定画布宿主元素;pic 参数必须,指定有效、可跨域操作的图片地址(大多数网络图片支持跨域);skip 参数可选,指定颗粒大小;width 和 height 参数可选,指定图片宽高尺寸。</p>
        <p>【注意事项】</p>
        <blockquote>一、宿主元素的背景(色)会影响颗粒的外观;<br>二、skip 参数本质是间隔多少个像素取原图像素数据,建议取值范围为 4~20;<br>三、当出现元素重叠,应设置好其他元素的 z-index 属性,以确保它们的正常显示与交互功能不受画布影响;<br>四、若可确定图片尺寸,则宿主元素的尺寸建议设置为和图片尺寸一样。若图片尺寸未知,应处理好宿主元素的定位问题。</blockquote>
</div>

<script type="text/javascript">
var sF = document.createElement('script');
sF.src = 'https://638183.freep.cn/638183/web/js/pic2dot.js';
sF.charset = 'utf-8';
document.body.appendChild(sF);

var p2d = {
        papa: '#papa',
        pic: 'https://638183.freep.cn/638183/Pic/38/nb7.jpg',
        skip: 4,
};
</script>

红影 发表于 2024-4-27 13:25

这颗粒化让图图的风格都变化了呢{:4_187:}

南无月 发表于 2024-4-27 16:58

看着跟抽丝效果有 点相似。。。

马黑黑 发表于 2024-4-27 17:00

南无月 发表于 2024-4-27 16:58
看着跟抽丝效果有 点相似。。。

不一样的。可以试一下 skip 值大一些看看效果

马黑黑 发表于 2024-4-27 17:00

红影 发表于 2024-4-27 13:25
这颗粒化让图图的风格都变化了呢

这是标准的废话{:4_170:}

南无月 发表于 2024-4-27 17:04

二、skip 参数本质是间隔多少个像素取原图像素数据,建议取值范围为 4~20;
这个试了一下,如果取值为10,变成空心的小圆圈了。。
小圆圈透出来的是背景色。。跟画布颜色一致。。

马黑黑 发表于 2024-4-27 17:07

南无月 发表于 2024-4-27 17:04
二、skip 参数本质是间隔多少个像素取原图像素数据,建议取值范围为 4~20;
这个试了一下,如果取值为10, ...

多试多了解脚本的工作机制

南无月 发表于 2024-4-27 17:12

马黑黑 发表于 2024-4-27 17:00
不一样的。可以试一下 skip 值大一些看看效果

我加过了。。
的确完全不一样。。
乍一看一样

南无月 发表于 2024-4-27 17:15

马黑黑 发表于 2024-4-27 17:07
多试多了解脚本的工作机制

边试边看说明才知道圆内空白是画布色。。圆之间缝隙是图片。。
数值越小,缝隙越大,图片看上去越完整。{:4_199:}

马黑黑 发表于 2024-4-27 17:46

南无月 发表于 2024-4-27 17:15
边试边看说明才知道圆内空白是画布色。。圆之间缝隙是图片。。
数值越小,缝隙越大,图片看上去越完整。 ...

是这么个道理

马黑黑 发表于 2024-4-27 17:47

南无月 发表于 2024-4-27 17:12
我加过了。。
的确完全不一样。。
乍一看一样

一样的那没必须做呢

小辣椒 发表于 2024-4-27 18:26

Ч棬psЧ{:4_199:}

小辣椒 发表于 2024-4-27 18:29

写了不少,出来这样了{:4_198:}

小辣椒 发表于 2024-4-27 18:29

黑黑这个也是抽丝效果吗

马黑黑 发表于 2024-4-27 18:36

小辣椒 发表于 2024-4-27 18:29
黑黑这个也是抽丝效果吗

颗粒化

马黑黑 发表于 2024-4-27 18:36

小辣椒 发表于 2024-4-27 18:26
Ч棬psЧ

{:4_189:}

马黑黑 发表于 2024-4-27 18:37

小辣椒 发表于 2024-4-27 18:29
写了不少,出来这样了

{:4_197:}

南无月 发表于 2024-4-27 19:31

马黑黑 发表于 2024-4-27 17:47
一样的那没必须做呢

也是哈。。抽丝和这个粒子画各有奥妙

南无月 发表于 2024-4-27 19:31

马黑黑 发表于 2024-4-27 17:46
是这么个道理

{:4_170:}
有贴子说明更清楚了

马黑黑 发表于 2024-4-27 20:00

南无月 发表于 2024-4-27 19:31
有贴子说明更清楚了

文档是很重要的
页: [1] 2 3 4 5 6
查看完整版本: canvas画布:颗粒化图像