最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • canvas如何绘制像素风

    正文概述 掘金(jsmask)   2021-08-13   565

    前言

    童年玩红白机。尤其国内的小霸王那段时光还记得么。

    那个马里奥大叔还记得么。

    canvas如何绘制像素风

    因为特别喜欢像素风的游戏从小到大一直都是,像素风本身就是由极度简单的元素构成极度复杂的画面,因此它可以具备无限的创作空间,形成令人过目不忘的独特画风。所以我想借用一张清晰的图片生成出具有像素点阵的图片来批量制造。

    这是我写的第一篇短文,很多不足之处请多包涵。

    介绍

    怎么让清晰的图片转化成像素风格的图片呢?

    首先我们要了解到像素风是由简单的单一色块来构成的。

    canvas如何绘制像素风 所以我们第一就是上传一张图片,然后绘制出来。再解析每隔一定像素给图片取出色值和位置来。再将这些色值重新绘制到画布相应位置中,那么一张像素风就是这么简单实现了。

    实现

    1. 上传原图片

    <input type="file" accept=".jpeg,.jpg,.png" />
    <script>
    document.querySelector("input[type=file]").addEventListener("change",uploadImage, false);
    </script>
    

    首先我们先要在页面放置一个上传文件得input。这些用accept属性限制他得上传类型,因为涉及到常规的一些图片上传这里就传jpeg,jpg,png三种格式了。

    与此同时,要监听他的改变从而拿到所需要转换的文件。

    接下来我将定义一个uploadImage函数。

    function uploadImage(e) {
        let file = e.target.files[0];
        if (!file) return;
        let fileReader = new FileReader();
        fileReader.readAsDataURL(file);
        fileReader.onload = () => {
            createImage(fileReader);
            e.target.value = "";
            document.querySelectorAll("canvas").forEach(node=>{node.remove();})
        };
    }
    
    function createImage(obj) {
        let img = new Image();
        img.onload = () => {
            drawImage(img);
        };
        img.src = obj.result;
    }
    

    这里我们就可以在fileReader.result拿到上传后的图片地址了,再写一个createImage函数用来接收文件对象实例化成Image方便给画布绘制。毕竟一个函数尽量只做单一的一件事也算是个好习惯吧。

    2.绘制原图片

    function drawImage(img) {
            let canvas = document.createElement("canvas");
            let ctx = canvas.getContext("2d");
            canvas.width = ctx.width;
            canvas.height = ctx.heigh
            let w = img.width,
              h = img.height;
            ctx.drawImage(img,0,0,w,h);
            document.body.appendChild(canvas);
     }
    

    canvas如何绘制像素风

    我们先实现把图片绘制到画布上康康,到底啥样。 现在我们就想了,我们到底要生成多大的像素画呢。 这里我们想做一个全局变量吧。

    let width = 32;
    let height = 32;
    let size = 10;
    

    我们定义生成一个宽度,高度,像素尺寸。宽高故名思议,就是我们要生成多少宽多少个点,高多少个点的像素。size表示了一个像素填充多大,也就是每隔size个像素取一个色值。

    接下来我们改造一下drawImage函数。

    function drawImage(img) {
        let canvas = document.createElement("canvas");
        let ctx = canvas.getContext("2d");
        canvas.width = ctx.width = width * size;
        canvas.height = ctx.height = height * size;
        let w = img.width,
            h = img.height;
        let v = w / h;
        if (v > 1) {
            w = width;
            h = w / v;
        } else {
            h = height;
            w = h * v;
        }
        ctx.drawImage(
            img,
            ((width - w) / 2) * size,
            ((height - h) / 2) * size,
            w * size,
            h * size
        );
        document.body.appendChild(canvas);
        
        let pxMap = createPxMap(ctx);
        drawPXCanvas(pxMap)
    }
    

    我们期望绘制图片后生成一套个包含像素信息的数组返回出来,然后我们再进行像素风的生成。

    当然我们为了两张图做对比,把原图宽高也和像素图拉平,并且居中显示在画布中。

    3.绘制像素画

    function createPxMap(ctx){
        let pxMap = [];
        for (let i = 0; i < width * size; i += size) {
            for (let j = 0; j < height * size; j += size) {
                let pixel = ctx.getImageData(i, j, 1, 1).data;
                let color = `rgba(${pixel[0]},${pixel[1]},${pixel[2]},${pixel[3]/255})`;
                pxMap.push({ x: i / size, y: j / size, color });
            }
        }
        return pxMap;
    }
    

    我首先要得到点的位置和颜色信息,ctx.getImageData可以获取到一个buffer数组,0-3位分别代表红,绿,蓝,透明度的信息。我们要将这些信息存储起来。

    到了最后我们终于要可以绘制像素画了。

    function drawPXCanvas(pxMap) {
        let canvas = document.createElement("canvas");
        let ctx = canvas.getContext("2d");
        canvas.width = ctx.width = width * size;
        canvas.height = ctx.height = height * size;
        pxMap.forEach((px) => {
            const { color, x, y } = px;
            ctx.fillStyle = color;
            ctx.fillRect(x*size, y*size, size, size);
        });
        document.body.appendChild(canvas);
    }
    

    我们要重新生成一个画布,将刚刚收集到的像素信息逐个绘制到画布上,这样一张简单的像素画就这么完成了,是不是很容易。

    canvas如何绘制像素风

    拓展

    其实拿到像素信息的时候,可以不局限于canvas2d像素画了。

    还有以下思路:

    1. 我们可以借助于css的box-shadow来生成像素画,用:root 或者scss 更容易控制大小和位置,配合animation生成动画也未尝不可。

      像素孙悟空

      像素小狐狸

    2. 甚至我们也可以拓展webgl的,生成3d像素,或者其他风格也未尝不可。

      3d皮卡丘

    3. 我们可以将再深入分析像素化构成逐帧生成视频和动画。。。


    这里我们就画上一个句号,本身我也第一次写东西,真心没底,还望大家多多支持,多多关注!


    起源地下载网 » canvas如何绘制像素风

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元