项目中遇到了这个问题,在搜索过程中看到别人的博文,大多是下面这种方法,大致如下:

let imgObj = {
count: 1,
success: (res) => {
let tempFilePaths = res.tempFilePaths;
wx.request({
url: tempFilePaths[0],
responseType: 'arraybuffer',
success: function (res) {
let base64 = wx.arrayBufferToBase64(res.data);
}
});
},
fail: (res) => {
wx.showToast({
title: res,
icon:'none'
});
}
}
wx.chooseImage(imgObj);

开发者工具中是可以获取到的,但是拿手机预览或者真机调试的时候,获取base64这个方法的url是不能用临时路径的,所以这个方法也就走不通了,那么就只能借助canvas了。

首先在wxml文件中写一个canvas

<canvas canvas-id='canvas' class='canvas'></canvas>

js文件中需要引入插件upng.js

const upng = require('../../common/libs/upng-js/UPNG.js')

获取base64代码如下:

let _this = this;
let imgObj = {
count: 1,
success: (res) => {
let tempPath = res.tempFilePaths[0];
wx.showLoading({
title: '图片加载中',
mask: true,
});
//获取图片的宽高
wx.getImageInfo({
src: tempPath,
success: res => {
let ratio = 2;
let canvasWidth = res.width
let canvasHeight = res.height;
// 保证宽高均在300以内
while (canvasWidth > 300 || canvasHeight > 300) {
//比例取整
canvasWidth = Math.trunc(res.width / ratio)
canvasHeight = Math.trunc(res.height / ratio)
ratio++;
}
_this.setData({
imgWidth: canvasWidth,
imgHeight: canvasHeight
})
let canvas = wx.createCanvasContext('canvas');
// 绘制图片至canvas
canvas.drawImage(tempPath, 0, 0, _this.data.imgWidth, _this.data.imgHeight);
// 绘制完成后
canvas.draw(false, () => {
//获取图像数据
wx.canvasGetImageData({
canvasId: 'canvas',
x: 0,
y: 0,
width: _this.data.imgWidth,
height: _this.data.imgHeight,
success(res) {
// 获取png编码
let pngData = upng.encode([res.data.buffer], res.width, res.height);
// 获取base64
let base64 = wx.arrayBufferToBase64(pngData);
},
fail(res) { },
complete(){
wx.hideLoading();
}
})
})
},
fail: res => {
wx.hideLoading()
}
})
},
fail: (res) => { }
};
wx.chooseImage(imgObj);

代码中限制了图片大小在300以内,所以只需要设置canvas的宽高大于300px即可,这样可以有效地限制绘制图片的大小以及获取到base64的大小,从而也缩短了转化base64的时间。

注:尽量还是用wx.uploadFile做图片上传,公司项目中虽然用该方法获取到了图片的base64编码,但是最终还是用uploadFile做的图片上传。

如有表述不准确之处,欢迎指正,欢迎补充,感谢阅读。

小程序获取图片base64编码的更多相关文章

  1. 获取图片base64编码的几种方法

    前文中我们聊了 Data URI 和 base64编码,稍微回顾下.base64编码 是将数据用 64 个可打印的字符进行编码的方式,任何数据底层实现都是二进制,所以都可以进行 base64编码,ba ...

  2. 微信小程序之图片base64解码

    不知道大家在做微信小程序的时候遇到base64解码的问题,我之前在做微信小程序的时候遇到base64解析图片一直有问题,所以在这里把遇到的问题和解决方案在这里记录一下: 在平时的项目中我们是直接用ba ...

  3. 小程序实现图片上传,预览以及图片base64位处理

    最近一段时间在做小程序项目,第一期功也完工了.需要好好总结一下经验,把项目中遇到的问题好好总结一下,遇到的问题,踩过的坑.今天写一个小程序实现图片上传,预览,以及删除,图片base64位处理.下面就是 ...

  4. [微信小程序] 微信小程序获取用户定位信息并加载对应城市信息,wx.getLocation,腾讯地图小程序api,微信小程序经纬度逆解析地理信息

    因为需要在小程序加个定位并加载对应城市信息 然而小程序自带api目前只能获取经纬度不能逆解析,虽然自己解析方式,但是同时也要调用地图,难道用户每次进小程序还要强行打开地图选择地址才定位吗?多麻烦也不利 ...

  5. .Net之微信小程序获取用户UnionID

    前言: 在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理).这段时间就有一个这样的需求,之前有个客户做了一个微信小程序 ...

  6. [转]玩转图片Base64编码

    转自:[前端攻略]:玩转图片Base64编码 图片处理在前端工作中可谓占据了很重要的一壁江山.而图片的 base64 编码可能相对一些人而言比较陌生,本文不是从纯技术的角度去讨论图片的 base64 ...

  7. 微信小程序实现图片是上传、预览功能

    本文实例讲述了微信小程序实现图片上传.删除和预览功能的方法,分享给大家供大家参考,具体如下: 这里主要介绍一下微信小程序的图片上传图片删除和图片预览 1.可以调用相机也可以从本地相册选择 2.本地实现 ...

  8. 微信小程序获取Access_token和页面URL生成小程序码或二维码

    1.微信小程序获取Access_token: access_token具体时效看官方文档. using System; using System.Collections.Generic; using ...

  9. 微信小程序获取用户手机号

    获取微信用户绑定的手机号,需先调用wx.login接口. 小程序获取code. 后台得到session_key,openid. 组件触发getPhoneNumber 因为需要用户主动触发才能发起获取手 ...

随机推荐

  1. 使用java命令出现Error: A JNI error has occurred, please check your installation and try again的错误

    运行Java程序,javac运行.java文件没有报错,但java运行的时候报错 ​​​ 仔细看一下报错 Exception in thread "main" java.lang. ...

  2. __nw_connection_get_connected_socket_block_invoke Connection has no connected handle 解决办法

    1. Xcode menu -> Product -> Edit Scheme... 2. Environment Variables -> Add -> Name: &quo ...

  3. MySQL 必知必会学习笔记(常用命令二)

    CREATE TABLE students(student_id INT UNSIGNED, name VARCHAR(30), sex CHAR(1), birth DATE, PRIMARY KE ...

  4. .NET MVC+angular导入导出

    cshtml: <form class="form-horizontal" id="form1" role="form" ng-sub ...

  5. alibaba/druid 下的 密码加密

    使用ConfigFilter cliangch edited this page on 3 Feb · 12 revisions ConfigFilter的作用包括: 从配置文件中读取配置 从远程ht ...

  6. 谱聚类(Spectral Clustring)原理

    谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也 ...

  7. selenium的三种等待方式

    selenium有三种等待方式 1.time.sleep() 设置等待最简单的方法就是强制等待,但一般不建议使用,可以在调试的时候进行使用 2.隐性等待 driver.implictily_wait( ...

  8. git bash + gitee

    使用Git Bash从Gitee上下载代码到本地以及上传代码到码云Git: https://www.cnblogs.com/babysbreath/p/7274195.html 指定克隆远端分支 ht ...

  9. 20165214 2018-2019-2 《网络对抗技术》Exp1+ 逆向进阶 Week4

    <网络对抗技术>Exp2 PC平台逆向破解之"MAL_简单后门" Week4 一.实验内容 Task1 自己编写一个64位shellcode.参考shellcode指导 ...

  10. python代码规范和命名规范

    一.简明概述 1.编码 如无特殊情况, 文件一律使用 UTF-8 编码 如无特殊情况, 文件头部必须加入#-*-coding:utf-8-*-标识 2.代码格式 2.1.缩进 统一使用 4 个空格进行 ...