现在手机摄像头的像素越来越高,把很高像素的照片上传腾讯人脸识别,会发生超时错误,并且消耗了更多的网络流量。通常业务场景要上传的图片,像素要求也没那么高。

目前compressimage只实现了压缩算法的压缩质量调整,并没有改变图片的尺寸,因此,压缩也有限。

在网上查了相关文章,大部分基于老的CanvasContext处理的,现在小程序已经不支持了。

由于对前端程序没什么经验,只有不断问度娘和尝试,终于实现了图片尺寸压缩,分享给大家。

在尝试中发现关键点是,图像的物理像素和逻辑像素的关系,有的使用的逻辑像素,有点使用的物理像素。

具体处理如下:

首先在页面上建一个看不见的canvas:

<canvas type="2d" id="myCanvas" style="width:{{cWidth}}px;height:{{cHeight}}px; position: absolute;left:-1000px;top:-1000px;"></canvas>

处理函数:

compressImg: function (imgFile) { //imgFile欲压缩的图片文件名和路径

var that = this;

console.log("compress start...");

const query = wx.createSelectorQuery()

query.select('#myCanvas')

.fields({

node: true,

size: true

})

.exec(function (res) {

const canvas = res[0].node;

const ctx = canvas.getContext('2d');

let image = canvas.createImage();

image.src = imgFile;

image.onload = function () {

let styleWidth = image.width; //单位px

let styleHeight = image.height; //单位px

var sizeLimit = 200;  //单位px,逻辑像素,欲压缩到的最大边的px数

if (Math.max(styleWidth, styleHeight) > sizeLimit) {

var percent = sizeLimit / Math.max(styleWidth, styleHeight);

styleWidth = Math.trunc(styleWidth * percent)

styleHeight = Math.trunc(styleHeight * percent)

}

const dpr = wx.getSystemInfoSync().pixelRatio;  //获取设备像素比,物理像素和逻辑像素的比值

//重点:DrawImage使用的物理像素,canvas的width、height一定要设置,否则,图像会变形。因为系统给的初始值和你图片的比例不一致

canvas.width = styleWidth * dpr;

canvas.height = styleHeight * dpr;

//canvas实际显示的是style中的width和height,单位px

that.setData({

cWidth: styleWidth,

cHeight: styleHeight

});

ctx.drawImage(image, 0, 0, canvas.width, canvas.height);

//使用jpeg格式,比png要小一个数量级

let dataURL = canvas.toDataURL("image/jpeg", 0.7);

//自己后续处理,我直接上传base64编码就可以了;

}

})

},

微信小程序使用RenderingContext进行图片尺寸压缩相关推荐

  1. 微信小程序分享接口卡片图片尺寸比例

    调用微信小程序分享需要button标签 <button open-type="share">test</button> 然后在js的page里加一个函数 o ...

  2. 小程序源码:强大的多功能图片处理器微信小程序源码下载图片画框合成-多玩法安装简单

    大家好这是以开以图片为主题的一款小程序 里面拥有了多种的图片处理功能,也算是比较强大的一款 另外小编最喜欢的就是里面的图片画框合成这个功能 该功能里面有N种画框模板,然后画框的尺寸根据您的图片自适应处 ...

  3. 微信小程序拍照视频上传php,微信小程序-拍照或选择图片并上传文件

    微信小程序-拍照或选择图片并上传文件 调用拍照API:https://mp.weixin.qq.com/debug/wxadoc/dev/api/media-picture.html?t=201612 ...

  4. 微信小程序-从相册获取图片,视频 使用相机拍照,录像上传+服务器(nodejs版)接收

    在本文 微信小程序-从相册获取图片 使用相机拍照 本地图片上传之前需要看看 微信小程序-获取用户session_key,openid,unionid - 后端为nodejs 代码封装是在上文添加的. ...

  5. 微信小程序开发——设置默认图片、错误加载图片

    wxml: <image src='{{imgArr[index]==""?defaultImg:imgList[index]}}' binderror="erro ...

  6. 微信小程录制视频上传服务器,微信小程序-从相册获取图片,视频使用相机拍照,录像上传+服务器nodejs版接收-微信小程序视频上传功能-微信小程序视频上传...

    在本文微信小程序-从相册获取图片使用相机拍照本地图片上传之前需要看看微信小程序-获取用户session_key,openid,unionid-后端为nodejs代码封装是在上文添加的.本文知识点:1. ...

  7. 微信小程序:多功能图片处理器

    这是一款多功能的一款照片处理器 UI简洁,功能也还不错 免除服务器和域名即可搭建,特别的简单好上手 一键化功能支持: 人脸融合(人脸融合,两张脸融合成一张) 换底色(相当于就是给照片的底色换色,一般都 ...

  8. [微信小程序]聊天对话(文本,图片)的功能(完整代码附效果图)

    相关文章: 1.小程序聊天群,发送语音,文字,图片. 2.微信小程序集成腾讯IM,实现实时音视频通话,1V1聊天 3.云开发微信小程序聊天群 4.接入网易云信IM即时通讯的微信小程序聊天室 5.微信小 ...

  9. 微信小程序点击放大图片

    微信小程序点击放大图片 在做微信小程序的时候遇到了这个点击放大的事件,这里记录一下 checkmap:function(e){var imageurl=this.data.mapimagesrc;co ...

最新文章

  1. 大数据软件产品研发进展及挑战
  2. Python : 什么是*args和**kwargs[转载]
  3. java实践源码--哈弗曼树
  4. 【计算机视觉】OpenCV的最近邻开源库FLANN
  5. 数字和为sum的方法数-01背包计数问题
  6. FrameLayout 测量过程
  7. Java JDK新特性探究-精简的JRE
  8. 为什么qt这么强大没人使用_浅析--懒懒口袋为什么得到这么多人的信任和使用?...
  9. 很好用的全硬盘搜索工具
  10. python发送请求给服务器参数传递方式以及服务器响应方式
  11. SAS-配对设计资料秩和检验
  12. php多域名跳转,旱的旱死,涝的涝死,中超联赛的怪事
  13. 河南财经政法大学计算机基础,河南财经政法大学就“忘开必修课”情况说明
  14. 有机化学类毕业论文文献(推荐10篇)
  15. 鸡蛋不要放在一个篮子里
  16. PDF怎么合并?这些合并方法你该知道
  17. 虚拟机CentOS7启动报错:Entering emergency mode
  18. 常用的PDF分割压缩软件有哪些?
  19. idea 出现中文乱码
  20. SAT作文-- 一篇优秀作文范例

热门文章

  1. ECCV22 最新论文汇总(目标检测、图像分割、监督学习、GAN等)
  2. java jnlp被阻止_JNLP 被java安全阻止
  3. 重启c语言-找出总分最高的学生
  4. codeblocks 添加多个工程文件 codeblocks添加已存在工程
  5. 关于java中的setOut()方法
  6. Unity中的警告--warning CS0108:'XXXX' hides inherited member 'AAAAA'. Use...的原因以及解决办法
  7. Linux下Centos系统安装
  8. wordpress文章编辑器,wp文章图片排版关键词水印插件
  9. MYSQL 金额转大写中文
  10. hyperv创建ubuntu20.10 ubuntu18.04虚拟机