当前位置: 首页 > news >正文

小程序转base64

小程序图片转Base64,方法总结。

2018年07月17日 18:25:58 Aleyn. 阅读数:23092

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36875339/article/details/81086205

小程序图片转base64

前言:看了很多博客没一个能解决问题的,小程序社区也逛了个遍,依然找不到小程序图片在本地转base64的方法,凡事还得靠自己啊,接下来就把所有方法做个总结,作为一个野生程序员,好东西绝对要分享。

如果不想了解踩坑历史的话,直接看第四种方法就可以了。

如果不想了解踩坑历史的话,直接看第四种方法就可以了。

如果不想了解踩坑历史的话,直接看第四种方法就可以了。

第一种方法

先上代码

var uploadImage = this.data.imageList[0]
var reader = new FileReader()
reader.onload = function (e) {
      var arrayBuffer = reader.result;
      var base64 = wx.arrayBufferToBase64(arrayBuffer)
}
reader.readAsArrayBuffer(new Blob(this.data.imageList)) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

代码看起来似乎没有问题,but~~~~~,人家微信根本就没提供 FileReader()这个方法,所以,这个方法在小程序这里,直接pass掉就行了,不可行。

第二种方法

这个方法很好,代码也是最易懂的。

首先,获取本地图片的临时路径

wx.chooseImage({
      success:res=>{
        this.urlTobase64(res.tempFilePaths[0]) 
      }
})
  • 1
  • 2
  • 3
  • 4
  • 5

接下来,把临时路径作为一个请求的url,把数据返回格式设置成arraybuffer,上代码。

urlTobase64(url){
    wx.request({
      url:url,
      responseType: 'arraybuffer', //最关键的参数,设置返回的数据格式为arraybuffer
      success:res=>{
	      //把arraybuffer转成base64
            let base64 = wx.arrayBufferToBase64(res.data); 
            
            //不加上这串字符,在页面无法显示的哦
            base64 = 'data:image/jpeg;base64,' + base64 
            
            //打印出base64字符串,可复制到网页校验一下是否是你选择的原图片呢
            console.log(base64) 
          }
    })
 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

校验base64字符串是否是你选择的图片

到这可以看到控制台成功打印出base64字符串,在网页上校验也是你选择的图片,一切看起来是那么的美好,兄dei,先把你的笑容收起来,在开发者工具的模拟器上没问题,你在真机上试一试,就会发现请求报错了,我知道你想说,你特么知道有问题还写这干啥,别激动兄dei,先把刀放下。马上给你介绍可用的方法。

第三种方法

先说思路:这个方法是通过,小程序的Canvas绘图实现的,获取到图片后,把图片绘制到canvas上,然后通过wx.canvasGetImageData()方法获取到图片的png编码,在把png编码转成base64,对Canvas还不是太了解的同学可以先去,开发者文档上熟悉一下。

    wx.chooseImage({
      count: 1,
      success: res => {
        //获取图片的宽高
        wx.getImageInfo({
          src: res.tempFilePaths[0],
          success: res => {
            this.setData({
              imgWidth: res.width,
              imgHeight: res.height
            })
          }
        })

        canvas = wx.createCanvasContext('canvas')
        
        canvas.drawImage(res.tempFilePaths[0], 0, 0, this.data.imgWidth, this.data.imgHeight) // 1. 绘制图片至canvas
        // 绘制完成后执行回调
        canvas.draw(false, () => {
          // 2. 获取图像数据
          wx.canvasGetImageData({
            canvasId: 'canvas',
            x: 0,
            y: 0,
            width: this.data.imgWidth,
            height: this.data.imgHeight,
            success(res) {
              // 3. png编码
              let pngData = upng.encode([res.data.buffer], res.width, res.height)
              // 4. base64编码
              let base64 = wx.arrayBufferToBase64(pngData)
              console.log(base64)
              // ...
            }
          })
        })
      }
    })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

经过上边的代码我们也可以把图片转成base64,但是,问题一大堆啊有木有,图片显示不全,有的只转了一部分,或者IOS真机图片显示颠倒。有没有解决的办法呢,肯定是有的了。直接把cardscanner文件夹放在你的项目中。
然后新建一个界面,分别引用cardscanne中的文件。最下方下载资源

index.wxml文件引用cardscanner.wxml

<import src="../../cardscanner/cardscanner.wxml" />
<template is="cardscanner" />
  • 1
  • 2

index.wxss文件引用cardscanner.wxss


@import '../../cardscanner/cardscanner.wxss'

  • 1
  • 2
  • 3

下边是index.js里边的内容。

import CardScanner from '../../cardscanner/cardscanner.js'

Page({
  onLoad(options) {
    let that = this
    this.imgPath = options.imgPath
    this.cardScanner = new CardScanner(this)
      .on('ImageChanged', (imgPath) => {
        that.imgPath = imgPath
        console.log(imgPath)
      })
      .on('DecodeStart', (imgPath) => {
        wx.showLoading({
          title: '生成中',
          mask: true
        })
      })
      .on('DecodeComplete', (res) => {
        if (res.code == 1) {
        //这里返回转过的base64字符串,打印查看
        let base64 = 'data:image/jpeg;base64,' + res.data
          console.log(base64)
          //做你要做的操作
          // ....
          // ....

        } else {
          console.log('解析失败:' + res.reason)
        }
        wx.hideLoading()
      })
  },
  onReady() {
    this.cardScanner.setImage(this.imgPath)
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36

以上是你新建界面的内容,直接复制j就行,注意修改文件引用路径,让你用最快的方式,把功能添加到项目中,如果有不同需求可以自己修改。

先上图片。

这是引用文件成功后的页面,点击选择按钮,选择图片。
这里写图片描述

这是选择完图片,把图片放在画布上的状态。
这里写图片描述

然后再点击确定按钮,正在生成的状态,由于时间稍微有点长,所以加了等待框。
这里写图片描述

这是转换成功后的控制台输出。在真机远程测试的输出。
这里写图片描述

看评论里有需求demo的在此也提供一下。直接用开发者工具打开就行了。
项目地址。

备用地址

经本人测试,基本没什么问题,唯一的缺陷就是转base64时间稍微有一点长,不过已经加等待框提示了,也不是什么大问题。

第四种

还记得第一种吗?微信没有提供操作文件的方法。 最近微信更新文档了,我也赶紧跑过来更新博客,也是操碎了心啊~~,好消息来了,微信终于出文件操作相关API了。而且这次很给力。我已经迫不及待想尝试一遍了。如下图:
在这里插入图片描述
获取到FileSystemManager,然后调用他的readFile()或者readFileSync(),参数如下:

在这里插入图片描述

支持的编码格式如下:
在这里插入图片描述

一下上了这么多看着就酸爽,哈哈~。
那我们要把图片转base64不是小菜一碟吗~~。

    wx.chooseImage({
      success: res => {
      wx.getFileSystemManager().readFile({
          filePath: res.tempFilePaths[0], //选择图片返回的相对路径
          encoding: 'base64', //编码格式
          success: res => { //成功的回调
            console.log('data:image/png;base64,' + res.data)
          }
        })

		//以下两行注释的是同步方法,不过我不太喜欢用。
       	 //let base64 = wx.getFileSystemManager().readFileSync(res.tempFilePaths[0], 'base64') 
        //console.log(base64)
      }
    })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注意版本库要在1.9.9以后的版本才支持,注意版本控制。

相关文章:

  • wikipedia简易安装
  • immutable的api使用
  • 移动博客七宗“罪”
  • immutable 特殊认知
  • SVN+HTTP的一个ulgy的错误
  • 深度理解Map Set eque is 对比 map是浅层的
  • 几个不错的 Java 源代码查询网站!
  • 十位数时间戳转化为时间格式的函数
  • 昨天回到家里,听到电话铃声响起,拎起话筒就一声:“IT,您好~~~”!
  • pubsub 发布订阅 sub 发布 pub订阅
  • 嵌入式软件的分类、特点以及发展趋势
  • webpack的优化总结
  • taro H5配置 cdn css js 缓存 hash 配置
  • CES2006感悟 随身多媒体产业前景光明
  • react-naive优秀案例
  • 网络传输文件的问题
  • 30天自制操作系统-2
  • flask接收请求并推入栈
  • jQuery(一)
  • js作用域和this的理解
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • MySQL几个简单SQL的优化
  • Nacos系列:Nacos的Java SDK使用
  • node入门
  • Python学习之路13-记分
  • Shadow DOM 内部构造及如何构建独立组件
  • V4L2视频输入框架概述
  • 给第三方使用接口的 URL 签名实现
  • 关于Flux,Vuex,Redux的思考
  • 深入 Nginx 之配置篇
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 推荐一个React的管理后台框架
  • 正则表达式小结
  • No resource identifier found for attribute,RxJava之zip操作符
  • 【干货分享】dos命令大全
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (9)目标检测_SSD的原理
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (zhuan) 一些RL的文献(及笔记)
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (五)关系数据库标准语言SQL
  • (转)平衡树
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core Swagger 过滤部分Api
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .sdf和.msp文件读取
  • /etc/fstab和/etc/mtab的区别
  • @Autowired 与@Resource的区别
  • @NestedConfigurationProperty 注解用法
  • @取消转义