Canvas怎么实现图片像素风的效果,方法是什么
Admin 2022-06-27 群英技术资讯 321 次浏览
童年玩红白机。尤其国内的小霸王那段时光还记得么。
那个马里奥大叔还记得么。
因为特别喜欢像素风的游戏从小到大一直都是,像素风本身就是由极度简单的元素构成极度复杂的画面,因此它可以具备无限的创作空间,形成令人过目不忘的独特画风。所以我想借用一张清晰的图片生成出具有像素点阵的图片来批量制造。
这是我写的第一篇短文,很多不足之处请多包涵。
怎么让清晰的图片转化成像素风格的图片呢?
首先我们要了解到像素风是由简单的单一色块来构成的。
所以我们第一就是上传一张图片,然后绘制出来。再解析每隔一定像素给图片取出色值和位置来。再将这些色值重新绘制到画布相应位置中,那么一张像素风就是这么简单实现了。
<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方便给画布绘制。毕竟一个函数尽量只做单一的一件事也算是个好习惯吧。
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); }
我们先实现把图片绘制到画布上康康,到底啥样。现在我们就想了,我们到底要生成多大的像素画呢。这里我们想做一个全局变量吧。
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) }
我们期望绘制图片后生成一套个包含像素信息的数组返回出来,然后我们再进行像素风的生成。
当然我们为了两张图做对比,把原图宽高也和像素图拉平,并且居中显示在画布中。
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); }
我们要重新生成一个画布,将刚刚收集到的像素信息逐个绘制到画布上,这样一张简单的像素画就这么完成了,是不是很容易。
其实拿到像素信息的时候,可以不局限于canvas2d像素画了。
还有以下思路:
我们可以借助于css的box-shadow来生成像素画,用:root 或者scss 更容易控制大小和位置,配合animation生成动画也未尝不可。
甚至我们也可以拓展webgl的,生成3d像素,或者其他风格也未尝不可。
3d皮卡丘
我们可以将再深入分析像素化构成逐帧生成视频和动画。。。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享用纯CSS3实现运行时钟的代码,实现效果包括时钟表和数字时钟两种,下文有具体的代码,有学习需要的朋友可以参考来实现。下图是实现效果展示,感兴趣就继续往下看吧。
关于HTML表格标记入门知识之表格标题垂直对齐属性的内容你了解多少,有想要了解一下的朋友吗?下面就跟小编来看一看相关内容吧!
这篇文章主要给大家分享的是关于CSS浮动导致网页的布局紊乱的问题的解决方法,一些朋友遇到在子盒子设置浮动之后,页面布局出现了紊乱的问题。我们想要解决这个问题,有几种方法,下面小编就给大家来一一介绍一下。
这篇文章主要介绍了使用canvas压缩图片上传的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了浅析图片上传及canvas压缩的流程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008