京东6.18大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

Canvas绘制像素风图片的示例代码

2024-11-2 22:38| 发布者: 284cc| 查看: 83| 评论: 0

摘要: 前言 童年玩红白机。尤其国内的小霸王那段时光还记得么。 谁人马里奥大叔还记得么。 由于特殊喜欢像素风的游戏从小到大不停都是,像素风本身就是由极度简朴的元素构成极度复杂的画面,因此它可以具备无穷的创作空间

前言

童年玩红白机。尤其国内的小霸王那段时光还记得么。
谁人马里奥大叔还记得么。

由于特殊喜欢像素风的游戏从小到大不停都是,像素风本身就是由极度简朴的元素构成极度复杂的画面,因此它可以具备无穷的创作空间,形成令人过目成诵的独特画风。所以我想借用一张清晰的图片天生出具有像素点阵的图片来批量制造。
这是我写的第一篇短文,很多不敷之处请多包容。

先容

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

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

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

实现

1. 上传原图片

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

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

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

接下来我将界说一个uploadImage函数。

[code] 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; }[/code]

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

2.绘制原图片

[code] 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); }[/code]

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

[code] let width = 32; let height = 32; let size = 10; [/code]

我们界说天生一个宽度,高度,像素尺寸。宽高故名思议,就是我们要天生多少宽多少个点,高多少个点的像素。size表现了一个像素添补多大,也就是每隔size个像素取一个色值。
接下来我们改造一下drawImage函数。

[code] 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) }[/code]

我们盼望绘制图片后天生一套个包罗像素信息的数组返回出来,然后我们再进行像素风的天生。
当然我们为了两张图做对比,把原图宽高也和像素图拉平,而且居中表现在画布中。

3.绘制像素画

[code] 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; }[/code]

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

[code] 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); } [/code]

我们要重新天生一个画布,将刚刚网络到的像素信息逐个绘制到画布上,如许一张简朴的像素画就这么完成了,是不是很容易。

拓展

实在拿到像素信息的时候,可以不范围于canvas2d像素画了。

另有以下思路:

我们可以借助于css的box-shadow来天生像素画,用:root 大概scss 更容易控制巨细和位置,共同animation天生动画也未尝不可。

甚至我们也可以拓展webgl的,天生3d像素,大概其他风格也未尝不可。

3d皮卡丘

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

到此这篇关于Canvas绘制像素风图片的示例代码的文章就先容到这了,更多相关Canvas 像素风内容请搜刮脚本之家以前的文章或继续欣赏下面的相关文章,希望大家以后多多支持脚本之家!


来源:https://www.jb51.net/html5/791072.html
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )|网站地图

GMT+8, 2025-7-2 08:32 , Processed in 0.029935 second(s), 18 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部