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

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. 构建web应用之——maven创建以及SpringMVC配置

    构建web应用第一步需要创建以及配置maven项目管理,同时配置启动SpringMVC,这里推荐参考CSDN的一篇文章链接:https://blog.csdn.net/weixin_42222334/ ...

  2. day1 登录

    #!/usr/bin/env python #Author:windtalker import os, getpass import sqlite3 from time import ctime pr ...

  3. 使用layer的弹窗时,出现layer引入成功,触发成功,控制台无报错,但是页面无变化或者仅出现遮罩层的问题的解决思路

    ------------------------------------------20180410补充------------------------------------------------ ...

  4. Html+css学习笔记二 标题

    学习新标签,标题 <html> <head> <title>tags</title> </head> <body> <h1 ...

  5. nginx之location的匹配规则

    nginx之location的匹配规则 一.语法规则 location [=|~|~*|^~] /uri/ { - } 符号 含义 = 开头表示精确匹配 ^~ 开头表示 uri 以某个常规字符串开头 ...

  6. 【webpack学习笔记】a07-代码分离

    官方文档说进行代码分离有三种方法: 入口起点:使用entry配置手动分离. 防止重复:使用CommonsChunkPlugin插件去重合分离chunk 注:在webpack4中,CommonsChun ...

  7. java-js知识库之二——canvas绘制炫彩气泡

    现在使用canvas绘制气泡,虽说很多人都已经实现过了,可能方法都大同小异,但自己写和看别人写完全是两码事,自己会写的才是自己的,话不多说,直接上代码. 先来一张效果图: 现在上代码,代码有详细的注释 ...

  8. CSS3动画与JS动画的优缺点?

    JS动画: 缺点:1.JS在浏览器的主线程中运行,而主线程还有其他的js脚本,样式布局,绘制任务等,对其干扰可能导致线程出现阻塞,从而造成丢帧的情况. 2.JS动画代码复杂度高于CSS3动画. 优点: ...

  9. mybatis中<foreach>标签的使用

    标签太多,记一下不是特别常用的标签~留着脑袋瓜不机灵的时候看! <foreach>标签  该标签的作用是遍历集合类型的条件 <select id="countByUserL ...

  10. node.js学习4--------------------- 根据不同路径来响应内容,以及中文乱码的解决

    /** * http服务器的搭建,相当于php中的Apache或者java中的tomcat服务器 */ // 导包 const http=require("http"); //创建 ...