canvas中toDataURL()将图片转为dataURL(base64)的方法

本文主要给大家介绍了关于利用canvas中todataurl()将图片转为dataurl(base64)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧,希望能帮助到大家。

将图片转为base64的好处

将图片转换为Base64编码,可以让你很方便地在没有上传文件的条件下将图片插入其它的网页、编辑器中。 这对于一些小的图片是极为方便的,因为你不需要再去寻找一个保存图片的地方。

将图片转换成base64编码的,在web网上一般用于小图片上,不仅可以减少图片的请求数量(集合到js、css代码中),还可以防止因为一些相对路径等问题导致图片404错误。

引言

假设一个应用场景:由于某些特殊原因从服务端请求到图片路径,要求通过该路径获取对应图片的 base64 dataURL。在这个场景中,我们首先推断该图片路径是可访问的,同时还需要一种将图片转换到 dataURL 的方法。

我们如何实现它呢?

dataURL

先大致回顾下正统的 dataURL 的语法,这有助于我们检验转换后的内容是否正确。一个完整的 dataURI 应该是这样的:

data:[][;base64],

登录后复制

其中mediatype声明了文件类型,遵循MIME规则,如“image/png”、“text/plain”;之后是编码类型,这里我们只涉及 base64;紧接着就是文件编码后的内容了。我们常常在 HTML 里看到img标签的src会这样写:

src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7"

登录后复制

这个img引用的就是以 base64 编码的 dataURL 了,只要浏览器支持,就可以被解码成 gif 图片并渲染出来。

.toDataURL()

FileReader对象也有类似的方法,比如.readAsDataURL() ,然而它只接受file或blob类型,而这两种类型一般只能通过元素的files属性获取,或者用Blob()构造函数手工创建一个新的对象。尴尬的是我们当前只有图片路径,受制于浏览器的安全策略, 的files属性是只读的,而Blob()构造函数只接受文件内容,两种方式都无法通过图片路径直接获取。上文中假设的应用场景迫使我们必先考虑如何通过路径获取到图片内容。canvas中toDataURL()将图片转为dataURL(base64)的方法是可以的,并且可以被绘制到中,而正巧拥有.toDataURL()方法。

万事具备,我们只需要把canvas中toDataURL()将图片转为dataURL(base64)的方法获取到的图片放到里再通过.toDataURL()方法转化下,就可以得到以 base64 编码的 dataURL。来看这个方法的语法:

canvas.toDataURL([type, encoderOptions]);

登录后复制

canvas是DOM元素对象;参数type指定图片类型,如果指定的类型不被支持则以默认值image/png替代;encoderOptions可以为image/jpeg或image/webp类型的图片设置图片质量,取值0-1,超出则以默认值0.92替代。

需要注意的是:在转换成 dataURL 前必须先确保图片成功加载到,于是.toDataURL()方法应该写在canvas中toDataURL()将图片转为dataURL(base64)的方法的onload异步事件中。现在就来实现一个功能函数:

 function getBase64(url){  //通过构造函数来创建的 img 实例,在赋予 src 值后就会立刻下载图片,相比 createElement() 创建 canvas中toDataURL()将图片转为dataURL(base64)的方法 省去了 append(),也就避免了文档冗余和污染  var Img = new Image(),   dataURL='';  Img.src=url;  Img.onload=function(){ //要先确保图片完整获取到,这是个异步事件   var canvas = document.createElement("canvas"), //创建canvas元素    width=Img.width, //确保canvas的尺寸和图片一样    height=Img.height;   canvas.width=width;   canvas.height=height;   canvas.getContext("2d").drawImage(Img,0,0,width,height); //将图片绘制到canvas中   dataURL=canvas.toDataURL('image/jpeg'); //转换图片为dataURL  }; }

登录后复制

一个可供随时调用的转换函数完成了,它会在图片被加载后返回一整个 dataURL 字符串。

完善

onload事件确保了转换任务在加载后执行,却又带来了新问题——dataURL 只有在图片加载完成后才会返回,我们无法确定图片什么时候完成加载。如果后续要对 dataURL 做相关处理(比如传递到其他服务器)的话,添加一个回调是必要的,这能确保后续处理任务在成功得到 dataURL 之后执行,我们需要修改getBase64() :

 function getBase64(url,callback){ //添加一个回调参数  ...  Img.onload=function(){   ...   canvas.getContext("2d").drawImage(Img,0,0,width,height);   dataURL=canvas.toDataURL('image/jpeg');   callback?callback(dataURL):null; //调用回调函数  }; }

登录后复制

在执行时添加回调:

 getBase64('//upload.jianshu.io/users/upload_avatars/555630/fdd1b798e6b0.jpg',(dataURL)=>{  console.log(dataURL); });

登录后复制

就是这样,如果不考虑兼容性的话,或许我们可以用 promise 和 generator 来实现,再添加一些错误处理就更完美了。

相关推荐:

html5 Canvas实现图片旋转

jquery插件canvaspercent.js实现百分比圆饼效果实例分享

Canvas处理图片的方法

以上就是canvas中toDataURL()将图片转为dataURL(base64)的方法的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2790886.html

(0)
上一篇 2025年3月8日 19:03:01
下一篇 2025年3月6日 13:02:34

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • JavaScript canvas实现旋转动画

    本文主要为大家详细介绍了javascript canvas实现围绕旋转动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。 使用canvas的convas来实现围绕旋转动画,外圈顺时针,里层逆时针 代码demo链接地址…

    2025年3月8日
    200
  • js封装成插件_Canvas统计图插件编写实例_javascript技巧

    下面小编就为大家带来一篇js封装成插件_canvas统计图插件编写实例。小编觉得挺不错的,现在就分享js源码给大家,也给大家做个参考。对js感兴趣的一起跟随小编过来看看吧 之前就说过,我想写一个canvas画统计图的插件,现在写好了 先说下…

    2025年3月8日
    200
  • 原生js和canvas模拟心电图代码分享

    使用原生js+canvas制作的模拟心电图的html页面,因为和项目一起打包放到了github上,所以使用了vue.js的单页模式,实际上你不需要使用任何额外的框架和样式,也可以完成这个demo,现在让我们一起来拆解这个项目吧! 1:在页面…

    编程技术 2025年3月8日
    200
  • 利用Canvas对图片进行处理的方法

    canvas,中文译为“画布”,html5中新增了元素,可以结合javascript动态地在画布中绘制图形。本文主要给和家介绍了关于利用canvas对图片进行处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考…

    2025年3月8日
    200
  • 讲述Canvas结合JavaScript实现图片特效

    我们都知道canvas是html5中的,canvas可以做出很多特效等神奇的东西,而javascript当然也可以,但是canvas结合javascript来实现图片特效你玩过嘛,没有的话那么我们一起来看看吧! 首先看一下源图和转换成粒子效…

    2025年3月8日
    200
  • Canvas如何实现下雨动画实例分享

    在codepen上看到一个canvas做的下雨效果动画,感觉蛮有意思的。就研究了下,这里来分享下,实现技巧。 效果截图: Canvas动画基础 大家都知道,Canvas其实只是一个画板。我们可以应用canvas的api在上面绘制各种图形。 …

    2025年3月8日
    200
  • 如何使用canvas来制作好用的涂鸦画板

    这次给大家带来如何使用canvas来制作好用的涂鸦画板,使用canvas来制作好用的涂鸦画板的注意事项有哪些,下面就是实战案例,一起来看一下。在canvas中获取光标坐标 获取坐标的代码很简单: nbsp;html>         …

    编程技术 2025年3月8日
    200
  • H5的Canvas如何实现绘制音乐环形频谱图

    这次给大家带来h5的canvas如何实现绘制音乐环形频谱图,h5canvas实现绘制音乐环形频谱图的注意事项有哪些,下面就是实战案例,一起来看一下。 在B站我们有很多的小伙伴们应该都看到过用AE做的可视化音乐播放器播放音乐的视频,看着特别酷…

    2025年3月8日
    200
  • canvas怎样做出黑色背景的红色烟花

    这次给大家带来canvas怎样做出黑色背景的红色烟花,canvas做出黑色背景的红色烟花的注意事项有哪些,下面就是实战案例,一起来看一下。 html 登录后复制 css body {    background: #000;    marg…

    2025年3月8日
    200
  • canvas怎样做出黑色背景的青色烟花

    这次给大家带来canvas怎样做出黑色背景的青色烟花,canvas做出黑色背景的青色烟花的注意事项有哪些,下面就是实战案例,一起来看一下。 html 2018 登录后复制 css html,body {    padding: 0px;  …

    2025年3月8日
    200

发表回复

登录后才能评论