canvas 制作表情包


canvas 制作表情包
代码如下。
<!DOCTYPE html> <html>
<head>
<title>表情制作</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<style>
#image-container {
display: flex;
}
</style>
</head> <body>
<script> </script> <div>
<input type="file" id="file" />
</div>
<div id="image-container">
<canvas width="500" height="500"></canvas>
<div>
<span>Top Line:</span><br/>
<input id="topLineText" type="text"><br/>
<span>Bottom Line:</span><br/>
<input id="bottomLineText" type="text"><br/>
<button id="saveBtn">Save</button>
</div>
</div>
<script>
function textChangeListener (evt) {
var id = evt.target.id;
var text = evt.target.value; if (id == "topLineText") {
window.topLineText = text;
} else {
window.bottomLineText = text;
} redrawMeme(window.imageSrc, window.topLineText, window.bottomLineText);
} function redrawMeme(image, topLine, bottomLine) {
//
var canvas = document.querySelector('canvas');
var ctx = canvas.getContext("2d");
if (image != null)
ctx.drawImage(image, 0, 0, canvas.width, canvas.height); //
ctx.font = '30pt Impact';
ctx.textAlign = 'center';
ctx.strokeStyle = 'black';
ctx.lineWidth = 3;
ctx.fillStyle = 'white'; if (topLine != null) {
ctx.fillText(topLine, canvas.width / 2, 40);
ctx.strokeText(topLine, canvas.width / 2, 40);
} if (bottomLine != null) {
ctx.fillText(bottomLine, canvas.width / 2, canvas.height - 20);
ctx.strokeText(bottomLine, canvas.width / 2, canvas.height - 20);
}
} function saveFile() {
window.open(document.querySelector('canvas').toDataURL());
} function handleFileSelect(evt) {
var canvasWidth = 500;
var canvasHeight = 500;
var file = evt.target.files[0]; var reader = new FileReader();
reader.onload = function(fileObject) {
var data = fileObject.target.result; var image = new Image();
image.onload = function() { window.imageSrc = this;
redrawMeme(window.imageSrc, null, null);
} image.src = data;
console.log(fileObject.target.result);
};
reader.readAsDataURL(file)
} window.topLineText = "";
window.bottomLineText = "";
var input1 = document.getElementById('topLineText');
var input2 = document.getElementById('bottomLineText');
input1.oninput = textChangeListener;
input2.oninput = textChangeListener;
document.getElementById('file').addEventListener('change', handleFileSelect, false);
document.querySelector('button').addEventListener('click', saveFile, false);
</script> </body>
</html>
canvas 制作表情包的更多相关文章
- 巧用 SVG 滤镜还能制作表情包?
本文将介绍一些使用 SVG feTurbulence 滤镜实现的一些有趣.大胆的的动效. 系列另外两篇: 有意思!强大的 SVG 滤镜 有意思!不规则边框的生成方案 背景 今天在群里面聊天,看到有人发 ...
- 【腾讯Bugly干货分享】舞动的表情包——浅析GIF格式图片的存储和压缩
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/v0pffOhjFWnVbU2lXjuEmw 导语 G ...
- 怎样用手机把视频变成GIF表情包?原来那么简单,网友:看完涨知识了
现如今表情包几乎成了,我们手机聊天的必需品了.不过相比于普通表情包,大家更喜欢用GIF表情包,因为动图表情包不仅更加搞笑,而且能更形象的表达我们的情绪.比较有想法的朋友甚至想自己制作GIF表情包,但是 ...
- 如何制作微信动态表情包 GIF制作工具哪个好
表情包已经成为我们生活聊天中必不可少的一部分,但是如何制作微信动态表情包呢?自己制作的表情包更加独有个性,今天小编带大家看一波原创表情包的制作方法吧! 使用工具:电脑 操作方法: 1.首先在手机上也是 ...
- python截取视频制作动态表情包+文字
1:安装moviepy库 2:安装IPython库 代码如下: from moviepy.editor import * from IPython.display import Image def B ...
- 我用Python一键保存了半佛老师所有的骚气表情包
本文首发于公众号「Python知识圈」,如需转载,请在公众号联系作者授权. 2019年发现两个有意思而且内容比较硬核的公众号.都是同一个人运营的,我们都叫他半佛老师,现实中的职业是风控,公众号内容涉及 ...
- 如何用AR Engine开发一个虚拟形象表情包?
现如今,人们在网上聊天.发帖时越来越爱用表情包,表情包一方面是一种个性化的表达方式,另一方面更能传达出当下的心理活动,可以说在网络社交中表情包是一个不可或缺的存在.加上近年来元宇宙的兴起,3D虚拟形象 ...
- 制作CAB包
制作CAB包 inf文件 INF是Device INFormation File的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚 ...
- 用Canvas制作简单的画图工具
今天用Canvas制作了一个画图工具,非常简单,功能也不是很多,主要有背景网格,画线,画圆,画矩形和画圆角矩形,也用到了canvas的一些基本知识,在这里一一列举. 1.线段的绘制: 如何绘制真正的1 ...
随机推荐
- Disruptor之粗糙认识
一 概述 1.Disruptor Disruptor是一个高性能的异步处理框架,一个“生产者-消费者”模型. 2.RingBuffer RingBuffer是一种环形数据结构,包含一个指向下一个槽点的 ...
- php有经纬度计算距离
/** * @desc 根据两点间的经纬度计算距离 * @param float $lat 纬度值 * @param float $lng 经度值 */ function getDistanc ...
- envi利用矢量数据对影像做多边形裁剪 (转)
2011-05-25 17:31:10| 分类: ENVI|举报|字号 订阅 来自:http://zhangling357522.blog.163.com/blog/static/184687296 ...
- 03_Redis数据类型(List)
[List类型] Redis采用的是LinkedList. ArrayList: 数组存储.查询快,增删慢. LinkedList:链表存储.增删快,查询慢,查询两端快. Redis的list内部采用 ...
- 转:如何在ArcMap下将栅格图象矢量化的基本步骤 (对影像的校准和配准、栅格图象矢量化)
矢量对象是以矢量的形式,即用方向和大小来综合表示目标的形式描述的对象.例如画面上的一段直线,一个矩形,一个点,一个圆,一个填充的封闭区域--等等. 矢量图形文件就是由这些矢量对象组合而成的描述性文件. ...
- ArcGIS Enterprise 10.5.1 静默安装部署记录(Centos 7.2 minimal)- 3、安装Portal for ArcGIS
安装Portal for ArcGIS 解压portal安装包,tar -xzvf Portal_for_ArcGIS_Linux_1051_156440.tar.gz 切换到arcgis账户静默安装 ...
- AJAX 学习笔记 2017_05_04
1.使用 AJAX 修改该文本内容 <%@ page language="java" contentType="text/html; charset=UTF-8&q ...
- Mantis查看问题列表的列名修改_"P","#"两列
在使用mantis的时候,点击菜单上的“查看问题”进去,就会罗列出当前的bug列表,可是列表的标题上存在着“P”和“#”的显示,个人觉得这两列在这里完全没有意义,或者说现有的显示使人觉得疑惑,究竟代表 ...
- vue + element-ui 制作tab切换(适用于单页切换不同标记显示不同内容)
本篇文章使用vue结合element开发tab切换单页不同的标记显示不同的内容. 1.安装element-ui npm install element-ui --save 2.在main.js中引入e ...
- python:验证客户端链接的合法性与socketserver
一.验证客户端链接的合法性 from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_a ...