canvas图片合成
图片合成实例——国庆头像H5
1 | function drawCanvasImage() { |
1 | <canvas ref={downloadRef} id='canvas'></canvas> |
useRef()
1、返回一个可变的 ref 对象,该对象只有个 current 属性,初始值为传入的参数( initialValue )。
2、返回的 ref 对象在组件的整个生命周期内保持不变
3、当更新 current 值时并不会重新渲染,这是与 useState 不同的地方
※使用useRef可以保证实时获取到最新的值
toDataURL()
1、toDataURL()方法是什么?
toDataURL()是canvas对象的一种方法,用于将canvas对象转换为base64位编码;
2、利用canvas的toDataURL()方法如何将图片转换为base64编码?
通过将图片绘制到canvas中,然后将canvas对象转换为base64编码,从而实现图片转为base64编码;
3、将图片转换为base64位编码有什么好处?
1)将图片转换为base64位编码后,图片会跟随代码(html、css、js)一起请求加载,不会再单独进行请求加载;
2)可以防止由于图片路径错误导致图片加载失败的问题;
4、toDataURL()方法的两个参数:toDataURL(type, encoderOptions)
1)type指定转换为base64编码后图片的格式,如:image/png、image/jpeg、image/webp等等,默认为image/png格式;
2)encoderOptions用于设置转换为base64编码后图片的质量,取值范围为0-1,超出取值范围用默认值0.92代替;
a标签法本地下载图片
步骤:
1、将 canvas 元素的数据通过原生 api 转换成 base64 编码的图片格式
2、利用 a 标签设置 download 属性可以将 href 链接元素下载,我们将 a 标签的 href 属性值设置为上一步获得的 base64 格式字符串
3、构造一个单击事件并通过 api 触发 a 标签的 click 事件完成下载
优缺点:
优点:只使用浏览器提供的原生 API 就能实现我们的需求。
缺点:
1)无法被异步代码包裹,也就是包含 Ajax 请求的情况下代码不生效。
2)对于分辨率过高的 canvas, 我们生成的 dataURL 过长,超过浏览器限制,可能会导致无法顺利下载。
解决办法:可采用blob方法,感兴趣可以百度学习一下^_^
canvas补充
详细学习canvas可参考https://www.runoob.com/w3cnote/html5-canvas-intro.html
学习2d上下文可参考https://blog.csdn.net/qq_41218152/article/details/82664178