前端实现头像转黑白头像
时间:2022-07-23
本文章向大家介绍前端实现头像转黑白头像,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
做了个将头像转换成黑白的页面: https://klren0312.github.io/avatarToBlackAndWhite/
代码
<div class="avatar" id="js-avatar">
<canvas class="canvas" id="js-canvas" height="300" width="300"></canvas>
</div>
<div class="tip hide" id="js-tip">请长按图片保存</div>
<label for="upload" class="btn">
上传头像
<input class="hide" type="file" name="file" id="upload" onchange="uploadFile(this)">
</label>
<button class="convert-btn" onclick="convert()">转换为黑白</button>
const btn = document.getElementById('js-button')
const tip = document.getElementById('js-tip')
const canvas = document.getElementById('js-canvas')
const ctx = canvas.getContext('2d')
// 上传文件回调, 将图片显示在canvas里
function uploadFile (e) {
showCanvas()
const img = e.files[0]
const url = URL.createObjectURL(img)
const image = new Image()
image.src = url
image.onload = function () {
ctx.drawImage(image, 0, 0, 300, 300)
}
e.value = null
}
// 转换函数, 将当前canvas转换为黑白, 并生成为图片
function convert () {
const imgData = ctx.getImageData(0, 0, 300, 300)
const data = imgData.data
for (var i = 0; i < data.length; i += 4) {
const average = (data[i + 0] + data[i + 1] + data[i + 2] + data[i + 3]) / 3
data[i + 0] = average // 红
data[i + 1] = average // 绿
data[i + 2] = average // 蓝
}
ctx.putImageData(imgData, 0, 0)
const afterURL = canvas.toDataURL('image/png')
// 生成图片
const img = document.createElement('img')
img.setAttribute('id', 'js-img')
img.src = afterURL
document.getElementById('js-avatar').appendChild(img)
hideCanvas()
}
// 隐藏canvas, 让图片替换, 方便长按保存
function hideCanvas () {
canvas.classList.add('hide')
tip.classList.remove('hide')
}
// 显示canvas, 清除canvas画布, 并移除之前生成的图片
function showCanvas () {
canvas.classList.remove('hide')
if (document.getElementById('js-img')) {
document.getElementById('js-img').remove()
}
tip.classList.add('hide')
}
页面截图
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 网络安全 | 瑞哥带你全方位解读防火墙技术!
- 【SpringBoot DB 系列】Jooq 之新增记录使用姿势
- 突击并发编程JUC系列-并发工具 Semaphore
- 构建Linux根文件系统
- ARM指令ldr和adr的区别
- 挂载文件系统出现"kernel panic..." 史上最全解决方案
- 汇编程序调用c函数为什么需要设置栈?
- Uboot到底如何启动内核
- Flink部署及作业提交(On YARN)
- Flink部署及作业提交(On Flink Standalone)
- MySQL题集
- 《深入浅出SQL》问答录
- Python_字典实现简单预约系统
- java_二维数组简单快递系统
- RabbitMQ六种工作模式