小程序 使用upng.js 把小程序选择的图片转换为base64

JavaScript031

小程序 使用upng.js 把小程序选择的图片转换为base64,第1张

有时候会遇到后端需要前端获取的图片文件转换成base64,在传给后台

小程序有专门的选择图片接口,

wx.chooseImage(OBJECT)

但是这个只是返回一个图片的临时路径,并不是文件数据本身。

小程序暂时没有接口直接转base64的

所以我们需要使用canvas和canvasGetImageData(小程序版本1.9.0以后要才有)先获取图片内容,

再通过插件upng.js插件实现图片转base64(所需插件文件附件中)

1. 把upng.js和pako.min.js文件放到项目中

2. 在pages下的页面js文件中导入

var upng = require('../../utils/upng.js')

这里只需要导入npng.js ,pako.min.js是在npng,js里面调用

3. 建一个canvas

chooseImage">人脸测试  

// 画布

// 生成base64位图片展示 变量imgbase64

need-to-insert-img

4. 添加js点击chooseImage事件

chooseImage: function() {

        var that = this

        var coss_signature = wx.getStorageSync('cos_signature')

        var canvasID = "imgCanvas"

        var canvas = wx.createCanvasContext(canvasID)

        wx.chooseImage({

            sourceType: ['album', 'camera'],

            sizeType: ['original'],

            count: 1,

            success: function (res) {

                var tempFilePaths = res.tempFilePaths

                // 获取文件路径

                var filePath = tempFilePaths[0]

                // 1. 绘制图片至canvas

                canvas.drawImage(filePath, 0, 0, 300, 200)

                // 绘制完成后执行回调,API 1.7.0

                canvas.draw(false, function(res){

                    // 2. 获取图像数据, API 1.9.0

                    wx.canvasGetImageData({

                        canvasId: canvasID,

                        x: 0,

                        y: 0,

                        width: 300,

                        height: 200,

                        success(res) {

                          // 3. png编码

                          let pngData = upng.encode([res.data.buffer], res.width, res.height)

                          // 4. base64编码

                          let base64 = wx.arrayBufferToBase64(pngData)

                          // ...

                          that.setData({

                            imgbase64: base64

                          })

                        }

                    })

                })

            }

        })

    }

5. 实现

need-to-insert-img

need-to-insert-img

tips

画布画的图片的长和宽是固定的,这个按照自己需求设置。

可以通过小程序的

wx.getImageInfo(OBJECT)

获取长和宽

相关链接

upng.js:  https://github.com/photopea/UPNG.js

wx-cardscanner:  https://github.com/zh8637688/wx-cardscanner 有时候会遇到后端需要前端获取的图片文件转换成base64,在传给后台

小程序有专门的选择图片接口,

但是这个只是返回一个图片的临时路径,并不是文件数据本身。

小程序暂时没有接口直接转base64的

所以我们需要使用canvas和canvasGetImageData(小程序版本1.9.0以后要才有)先获取图片内容,

再通过插件upng.js插件实现图片转base64(所需插件文件附件中)

1. 把upng.js和pako.min.js文件放到项目中

2. 在pages下的页面js文件中导入

var upng = require('../../utils/upng.js')

这里只需要导入npng.js ,pako.min.js是在npng,js里面调用

3. 建一个canvas

chooseImage">人脸测试  

// 画布

// 生成base64位图片展示 变量imgbase64

4. 添加js点击chooseImage事件

chooseImage: function() {

        var that = this

        var coss_signature = wx.getStorageSync('cos_signature')

        var canvasID = "imgCanvas"

        var canvas = wx.createCanvasContext(canvasID)

        wx.chooseImage({

            sourceType: ['album', 'camera'],

            sizeType: ['original'],

            count: 1,

            success: function (res) {

                var tempFilePaths = res.tempFilePaths

                // 获取文件路径

                var filePath = tempFilePaths[0]

                // 1. 绘制图片至canvas

                canvas.drawImage(filePath, 0, 0, 300, 200)

                // 绘制完成后执行回调,API 1.7.0

                canvas.draw(false, function(res){

                    // 2. 获取图像数据, API 1.9.0

                    wx.canvasGetImageData({

                        canvasId: canvasID,

                        x: 0,

                        y: 0,

                        width: 300,

                        height: 200,

                        success(res) {

                          // 3. png编码

                          let pngData = upng.encode([res.data.buffer], res.width, res.height)

                          // 4. base64编码

                          let base64 = wx.arrayBufferToBase64(pngData)

                          // ...

                          that.setData({

                            imgbase64: base64

                          })

                        }

                    })

                })

            }

        })

    }

5. 实现

tips

画布画的图片的长和宽是固定的,这个按照自己需求设置。

可以通过小程序的

获取长和宽

相关链接

upng.js:  https://github.com/photopea/UPNG.js

wx-cardscanner:  https://github.com/zh8637688/wx-cardscanner

Buffer官方文档如下 http://nodejs.cn/api/buffer.html

node开发过程中,常用的就是将图片转换成base64编码,这时候就用到buffer了:

运行

将打印出来的结果输入到test.js这个文件里,便于查看。之后我们在test.js里就能看到这个图片的base64编码了。

再设置好其 DataURI前缀 就能在浏览器里查看这张图片啦!

下面是我在浏览器查看的结果:

中秋刚过去几天,首先在这里祝与亲人团聚的朋友们阖家欢乐,告诉和我一样独在异乡的青年们不要孤单,你不是一个人,在外也要好好生活,每逢佳节和朋友们一起吃点好吃的^ _ ^

自我感觉良好,但是运行之后报错了

谷歌翻译:canvas无法执行toDataURL方法:污染的画布无法输出

看不懂是吧?不要着急,一般当我们遇到这种一长串且有明显关键词的报错,你应该松一口气,这类错误一般直接贴上google下就可以找到答案。比如: https://stackoverflow.com/questions/22710627/tainted-canvases-may-not-be-exported

补充:

经过大家的共同探讨,问题得到了解决,需要在url中加入“!”

具体原因可以阅读 url-loader is encoding path instead of image#43

总结下就是:

由于我们webpack中的配置,用于提高性能

所以debug时我们发现图片被转码了2次:

第一个loader(url)对图像进行编码并返回编码图像的路径

第二个loader(文件)是对编码图像进行编码的路径