设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间14 现在时间14 缓存数据 别人唱歌换气声好难听。。怎么到这里就觉得很合适

别人唱歌换气声好难听。。怎么到这里就觉得很合适 -- Wonderful U (Demo Version)

查看: 838|回复: 1

JS实现图片元素转BASE64编码的简单示例

[复制链接]

  离线 

TA的专栏

  • 打卡等级:无名新人
  • 打卡总天数:1
  • 打卡月天数:0
  • 打卡总奖励:10
  • 最近打卡:2024-12-15 05:15:15
等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
29
主题
23
精华
0
金钱
98
积分
54
注册时间
2023-9-29
最后登录
2025-3-14

发表于 2023-12-27 21:48:51 | 显示全部楼层 |阅读模式
这里分享前端实现图片转 BASE64 的通用方法,支持
  1. 缩放
复制代码
  1. 灰度处理
复制代码
  1. /**
  2. * 将指定元素对象转换为 Base64 格式
  3. * @param {HTMLImageElement|String} img - 图片元素(如通过 document.querySelector 获取)或者选择器
  4. * @param {Object} ps - 额外参数
  5. * @param {Number} ps.scale - 缩放,默认 1
  6. * @param {Boolean} ps.withGray - 是否进行灰度处理,默认 true
  7. * @param {String} ps.format - 图片格式,默认 image/jpeg
  8. * @param {Boolean} ps.natural - 是否使用图片元素的原始尺寸,默认 true
  9. * @returns {String}
  10. */
  11. function imgToBase64(img, ps={}) {
  12.     if(typeof(img)==='string')  img = document.querySelector(img)
  13.     if(Object.prototype.toString.call(img) != '[object HTMLImageElement]')
  14.         throw Error(`参数 img 必须是一个有效的 HTMLImageElement 对象或选择器`)

  15.     ps = Object.assign({scale:1.0, withGray:true, format: "image/jpeg", natural:true}, ps)
  16.     let canvas = document.createElement("canvas")
  17.     let ctx = canvas.getContext("2d")
  18.     let width = ps.natural? img.naturalWidth : img.width
  19.     let height = ps.natural? img.naturalHeight : img.height

  20.     canvas.width = width * ps.scale
  21.     canvas.height = height * ps.scale
  22.     ctx.drawImage(img, 0, 0, width, height, 0, 0, canvas.width, canvas.height)

  23.     //灰度处理,一定程度上使得图片内字符更加清晰
  24.     if (ps.withGray) {
  25.         let imgD = ctx.getImageData(0, 0, canvas.width, canvas.height)
  26.         let len = canvas.width * canvas.height * 4
  27.         for (let i = 0; i < len; i += 4) {
  28.             let gray = Math.floor((imgD.data[i] + imgD.data[i + 1] + imgD.data[i + 2]) / 3)
  29.             imgD.data[i] = imgD.data[i + 1] = imgD.data[i + 2] = gray > 100 ? gray : 0
  30.         }

  31.         ctx.putImageData(imgD, 0, 0)
  32.     }

  33.     return canvas.toDataURL(ps.format)
  34. }
复制代码
使用方式
  1. imgToBase64(".logo")
  2. // 缩放 0.5 倍
  3. imgToBase64(document.querySelector(".logo"), {scale:0.5})
复制代码
如需处理远程图片,可以参考上面代码进行改造。
拓展
废话不多说,直接上代码
  1. base64 (url) {
  2.       return new Promise((resolve) => {
  3.         const image = new Image()
  4.         // 先设置图片跨域属性
  5.         image.crossOrigin = 'Anonymous'
  6.         // 再给image赋值src属性,先后顺序不能颠倒
  7.         image.src = url
  8.         image.onload = function () {
  9.           const canvas = document.createElement('CANVAS')
  10.           // 设置canvas宽高等于图片实际宽高
  11.           canvas.width = image.width
  12.           canvas.height = image.height
  13.           canvas.getContext('2d').drawImage(image, 0, 0)
  14.           // toDataUrl可以接收2个参数,参数一:图片类型,参数二: 图片质量0-1(不传默认为0.92)
  15.           const dataURL = canvas.toDataURL('image/jpeg')
  16.           resolve(dataURL)
  17.         }
  18.         image.onerror = () => {
  19.           resolve({ message: '相片处理失败' })
  20.         }
  21.       })
  22.     },
复制代码
我们传入一个图
  1. async mounted () {
  2.     // this.init()
  3.     const url = await this.base64('https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg')
  4.     console.log(url)
  5.   },
复制代码
片地址看看是否成功
1.jpeg

但是,一般我们在做这样的需求前,处理的图片肯定不止一张,接下来就要批量处理,但是这个方法是异步,我们要将一个数组内的每个对象的地址都转成base64,才算真正完成我们的功能。前端一般接收到后端的数据一般是这种格式。
2.png

但是我们正常使用map函数遍历去将图片地址转成base64,上代码:
  1. const newImgOBj = await Promise.all(this.imgOBj.map(async (item) => {
  2.       return {
  3.         name: item.name,
  4.         img: await this.base64(item.img)
  5.       }
  6.     }))
  7.     console.log(newImgOBj)
复制代码
打印一下看结果发现我们的图片地址已经变成了base64编码。
3.png

最后我们将图片使用img标签正常渲染就好了,小知识:浏览器在识别同一个一模一样的图片地址,浏览器只会请求一遍该图片资源哦。
以上就是JS实现图片元素转BASE64编码的简单示例的详细内容,更多关于JS图片转BASE64的资料请关注晓枫资讯其它相关文章!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
22
积分
24
注册时间
2022-12-27
最后登录
2022-12-27

发表于 昨天 04:00 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表