猛点 这里 看高清妹子图。
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过canvas
,可以很轻松实现这个功能。
其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根据灰度值的大小,分别用字符 #*+“
和空格来填充。
下面是源码:
HTML:一个 canvas
元素 #cv
,一个字符画容器 #txt
。
<canvas id="cv">fuck ie</canvas>
<div id="txt"></div>
css:由于每一行用 p
来填充,所以 p
的 height
和 font-size
大小应该一致都是 12px
,这样可以避免每行出现空隙。
* {margin: 0;padding: 0;}
body {font-size: 12px; margin: 10px; font-family: simsun; background: #fff;}
p { height: 12px;}
p.ts { margin: 10px 0 0 0; width: 500px; float: left;}
span {width: 12px;}
#cv, #txt {float: left;}
#cv { margin-right: 5px;}
javascript:请看注释和下面的解释。
var cv = document.getElementById('cv');
var c = cv.getContext('2d');
var txtDiv = document.getElementById('txt');
var fileBtn = document.getElementById("up-button");
var img = new Image();
img.src = 'a.jpg';
img.onload = init; // 图片加载完开始转换
fileBtn.onchange = getImg;
// 根据灰度生成相应字符
function toText(g) {
if (g <= 30) {
return '#';
} else if (g > 30 && g <= 60) {
return '&';
} else if (g > 60 && g <= 120) {
return '$';
} else if (g > 120 && g <= 150) {
return '*';
} else if (g > 150 && g <= 180) {
return 'o';
} else if (g > 180 && g <= 210) {
return '!';
} else if (g > 210 && g <= 240) {
return ';';
} else {
return ' ';
}
}
// 根据rgb值计算灰度
function getGray(r, g, b) {
return 0.299 * r + 0.578 * g + 0.114 * b;
}
// 转换
function init() {
txtDiv.style.width = img.width + 'px';
cv.width = img.width;
cv.height = img.height;
c.drawImage(img, 0, 0);
var imgData = c.getImageData(0, 0, img.width, img.height);
var imgDataArr = imgData.data;
var imgDataWidth = imgData.width;
var imgDataHeight = imgData.height;
var html = '';
for (h = 0; h < imgDataHeight; h += 12) {
var p = '<p>';
for (w = 0; w < imgDataWidth; w += 6) {
var index = (w + imgDataWidth * h) * 4;
var r = imgDataArr[index + 0];
var g = imgDataArr[index + 1];
var b = imgDataArr[index + 2];
var gray = getGray(r, g, b);
p += toText(gray);
}
p += '</p>';
html += p;
}
txtDiv.innerHTML = html;
}
// 获取图片
function getImg(file) {
var reader = new FileReader();
reader.readAsDataURL(fileBtn.files[0]);
reader.onload = function () {
img.src = reader.result;
}
}
如何取到相应像素点的灰度?
getImageData
方法返回一个对象,每个像素点的 rgba
值都保存在其 data
属性下面,这是一个一位数组, 也就是说,rgba
分别对应一个值,然后接着就是一下像素点的 rgba
,假设 getImageData.data
的值为[1,2,3,4,5,6,7,8]
, 那么 getImageData
对象范围就包含了 2
个像素点,第一个像素点的 rgba
值分别是1,2,3,4
,第二个像素点的就是 4,5,6,7,8
。 因此,我们在取每个像素点的 rgba
值的时候其 index
应该在像素点的索引值上乘以 4
,然后通过 getGray()
计算灰度。
如何对应到字符?
再考虑一下每个字符串的宽度是 6px
,高度是 12px
,所以我们不可能每个像素点都要对应一个字符,那样生成的图案将非常之大。 我们只能根据图片宽高,来定义一个间隔,横向间隔 6px
,纵向间隔 12px
取一次像素,这样可以保证生成的字符画大小和原图保持一致。
最后请看 demo: http://justjavac.com/img2txt/
原文链接: http://justjavac.com/javascript/2013/09/25/ji-yu-canvas-jiang-tu-pian-zhuan-hua-cheng-zi-fu-hua.html
最后附上几张图
相关推荐
- 一旦SVG内容成功渲染到Canvas,我们可以使用`toDataURL()`方法将Canvas内容转换为Data URL,该URL包含一个表示图像数据的Base64编码字符串。 ``` var dataUrl = canvas.toDataURL('image/png'); ``` 这个Data...
这里我们关注的是如何利用DOM(Document Object Model)和Canvas API将HTML内容转化为Canvas图像,进一步转换为base64编码的图片。这个过程通常涉及到以下几个关键知识点: 1. DOM (Document Object Model): DOM...
`FileReader`的`readAsDataURL()`方法会将图片文件转化为Data URL,这是一种以Base64编码的字符串形式表示图片的机制。 2. **转换为Canvas**:加载完图片后,我们需要将图片转换为Canvas元素。这可以通过创建一个新...
"image-to-text"这款工具的核心功能是将图像转换成字符画,它的工作原理基于图像处理和字符渲染。首先,它通过读取用户上传的图片,将其转化为像素矩阵,这是图像处理的基础。接着,工具会根据像素的灰度值,选择...
导出时,将Canvas的内容转换成Base64编码的图像URL,可以方便地存储或分享;导入时,解析Base64编码,将图像绘制回Canvas。 9. **Android**:虽然题目中提到了Android标签,但描述中并未明确指出这是一个Android...
html2canvas则是一个JavaScript库,它可以将HTML元素转化为Canvas图像,进一步可以将Canvas内容转换为Base64编码的图片。这个过程允许我们将网页的任何部分,包括由Katex渲染的数学公式,转换为可存储和分享的图片...
在这个项目中,Canvas将用来加载和处理图片,将其像素信息转化为ASCII字符。 3. **图片加载与处理**:首先,我们需要使用HTML5的`<img>`元素加载图片,并利用`onload`事件确保图片完全加载后才进行后续处理。然后,...
在JavaScript中,可以使用`FileReader`对象读取选中的图片文件,将其转化为`base64`编码的字符串,然后插入到HTML的`<img>`标签中预览。这样,我们就实现了图片的上传和显示。 接下来是使用Canvas来制作海报的关键...
使用Canvas的toDataURL方法,可以将Canvas中的图形内容转换成图片格式(如PNG或JPEG)的数据字符串。这个方法接受一个参数指定图片格式,然后返回一个URL编码的数据字符串,这个字符串可以被用作标签的src属性,从而...
// 在这里添加将时间转换为字符串的逻辑,例如:'09:45:30' // 清除画布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 在这里添加绘制时间的代码,例如:绘制数字、刻度线等 ...
火焰燃烧滤镜canvas动效是一种基于HTML5 Canvas技术的视觉特效,它能够在网页上实现逼真的火焰燃烧效果。Canvas是HTML5的一个重要组成部分,提供了一种在网页上绘制图形的低级API,允许开发者通过JavaScript代码动态...
"Image2Html"就是这样一个工具,它能够帮助我们将任意图片转化为字符画,无论是大小字符、彩色还是黑白,都能轻松应对,为我们的视觉体验带来新的惊喜。 1. **字符画的基本原理** 字符画的创作基于人类视觉的感知...
- 使用`canvas`实现3D旋转需要对每个ASCII字符进行3D坐标转换,再将转换后的坐标映射到2D画布上。 4. **JavaScript实现**: - 首先,我们需要获取`canvas`元素并创建`2D渲染上下文`,这是绘图的基础。 - 然后,...
**Base64编码**是一种将二进制数据转化为可打印ASCII字符的方法,方便在网络上传输。在拍照上传的流程中,由于HTTP协议不支持二进制流的直接传输,因此通常会将图片数据先Base64编码,然后作为字符串发送到服务器。...
Base64是一种用于将二进制数据编码为ASCII字符串的编码方式,它在传输或存储非文本数据时非常有用,例如图片。 在HTML文档中,`<img>`标签通常用于展示图像,但在这里,我们将通过JavaScript来实现这一功能。首先,...
【标题】"基于H5 Canvas的在线简易word编辑器"是一个使用HTML5的Canvas技术构建的轻量级文档编辑工具,旨在提供一个基础的在线文本编辑环境,类似于Microsoft Word的基本功能。Canvas是HTML5的一个重要特性,允许...
"DELPHI将文字转化成图片"这个主题涉及到了计算机图形学和图像处理技术,是软件开发中的一个重要应用场景。 在描述中提到,这个功能的目的是将输入的文字转换为指定大小的图片,以便于发送到LED显示屏等设备上。在...
6. **保存验证码**:将Canvas的内容转换为数据URL(通常以base64编码),并将其存储在服务器端或客户端的Session或Cookie中,用于后续验证。 7. **用户交互**:当用户输入验证码后,通过与服务器端或本地存储的...
接着,通过`canvas.toDataURL()`方法将canvas的内容转换为Base64字符串,该字符串的前缀是`data:image/jpeg;base64,`,表示这是JPEG格式的Base64编码图像。最后,我们创建了一个隐藏的下载链接,将Base64字符串设为...
综上所述,构建一个基于canvas的多张图片编辑器需要理解canvas的绘图API,掌握html2canvas库的使用,解决图片跨域问题,以及了解base64和blob之间的转换。此外,还需要考虑用户界面设计和编辑功能的实现,如撤销操作...