前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >three.js 将图片马赛克化

three.js 将图片马赛克化

作者头像
郭先生的博客
发布2020-08-31 15:45:03
2.7K0
发布2020-08-31 15:45:03
举报
文章被收录于专栏:郭先生的博客

这篇郭先生来说说BufferGeometry,类型化数组和粒子系统的使用,并且让图片有马赛克效果(同理可以让不清晰的图片清晰化),如图所示。在线案例点击图片马赛克

1. 解析图片

解析图片和上一篇一样

代码语言:javascript
复制
initCanvas() {
    canvas = document.createElement('canvas');
    content = canvas.getContext('2d');
    canvas.width = 1600;
    canvas.height = 1200;
    img = new Image();
    img.crossOrigin = '*';
    img.src = "/static/images/base/girl.jpg";
    img.onload = () => {
        content.drawImage(img, 0, 0, canvas.width, canvas.height);
        imgDate = content.getImageData(0, 0, canvas.width, canvas.height);
        this.createPotCloud();   //创建点云
    };
}

2. 操作像素点

代码语言:javascript
复制
createPotCloud() {
    if (points) {
        scene.remove(points)
    }
    let cw = Math.floor(canvas.width / size);
    let ch = Math.floor(canvas.height / size);
    particles = cw * ch;
    geometry = new THREE.BufferGeometry();
    positions = new Float32Array(Math.floor(particles * 3));
    positions_af = new Float32Array(Math.floor(particles * 3));
    var colors = new Float32Array(Math.floor(particles * 3));
    for (var i = 0; i < positions.length; i += 1) {

        positions[3 * i] = - canvas.width / 2 + (i % cw) * size;
        positions[3 * i + 1] = canvas.height / 2 + Math.floor((-1 - i) / cw) * size;
        positions[3 * i + 2] = 0;

        let selectPos = size * (i % cw) + Math.floor(i / cw) * cw * size * size;
        colors[3 * i] = imgDate.data[4 * selectPos] / 255.0;
        colors[3 * i + 1] = imgDate.data[4 * selectPos + 1] / 255.0;
        colors[3 * i + 2] = imgDate.data[4 * selectPos + 2] / 255.0;
    }
    geometry.setAttribute('position', new THREE.BufferAttribute(positions, 3));
    geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3))
    geometry.dynamic = true;
    geometry.attributes.position.needsUpdate = true;
    var material = new THREE.PointsMaterial({ size: size, vertexColors: THREE.VertexColors })
    points = new THREE.Points(geometry, material);
    points.name = 'points';
    scene.add(points);
    loaded = true;
},

可以不用纠结代码,核心思想其实我们只需要每隔一定的颜色点取出一个颜色点,然后将这个颜色赋予到geometry的color属性上,就可以了,也可以每隔两行、两列取一个点,但是图片上面的点是一维的,所以需要一些数学方法,

如图所示,原理很简单哦。将不清晰的图片清晰化,就是需要插入更多的像素点,插入的像素点,需要根据已存在的像素点的颜色进行插值,比如原图的像素点1为0xffffff,像素点2的颜色为0xdddddd,则插在两个像素点之间像素点的颜色为0xeeeeee,以此类推。

转载请注明地址:郭先生的博客

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 解析图片
  • 2. 操作像素点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档