原理:利用canvas来实现,将图片绘制到canvas上,然后canvas转图片时,微信提供的一个方法wx.canvasToTempFilePath(Object object, Object this),此方式可以指定生成图片的质量,下图是从官方API截的图:

其中quality可以指定图片的质量,quality的值越小,图片越模糊,通过此方法可以实现图片的压缩

注意:

1.quality设置只对jpg格式的图片有效,使用时要将fileType设置为“jpg”, 此举可能会导致其它格式的图片变为jpg格式 2.透明背景的png图片,绘制到canvas上使用此方式导出的图片是黑色背景,有需求的话是需要canvas先设置背景色的,请小伙伴们注意爬坑。

有了这个参数,压缩就简单很多了,下面是代码:

wxml:
  1. <view>
  2. <button bindtap="chooseImage">选择图片</button>
  3. </view>
  4.  
  5. <!-- 展示压缩后的图片 -->
  6. <view style="display: flex;justify-content: center;flex-direction: column">
  7. <image width="50" mode="widthFix" src="{{imagePath}}"></image>
  8. </view>
  9.  
  10. <button wx:if="{{imagePath.length>0}}" bindtap="save">点击下载压缩后的图片</button>
  11.  
  12. <!-- 用来渲染的canvas -->
  13. <canvas canvas-id='attendCanvasId' class='myCanvas' style='width:{{cWidth}}px;height:{{cHeight}}px;position: fixed;top: -9999px;left: -9999px;'></canvas>

js:

  1. Page({
  2. data: {
  3. imagePath: '',
  4. quality: 0.2
  5. },
  6. onLoad: function (options) {
  7.  
  8. },
  9. /**
  10. * 选项添加图片事件
  11. */
  12. chooseImage: function (e) {
  13. var that = this;
  14. wx.chooseImage({
  15. sizeType: ['compressed'], //可选择原图或压缩后的图片
  16. sourceType: ['album', 'camera'], //可选择性开放访问相册、相机
  17. success: result => {
  18. wx.getImageInfo({
  19. src: result.tempFilePaths[0],
  20. success: function (res) {
  21. that.setData({
  22. cWidth: res.width,
  23. cHeight: res.height
  24. })
  25. that.getCanvasImg(result.tempFilePaths, res.width, res.height, that.data.quality, function (res) {
  26. that.setData({
  27. imagePath: res.tempFilePath
  28. });
  29. });
  30. }
  31. })
  32. }
  33. })
  34. },
  35. /**
  36. * 质量压缩
  37. */
  38. getCanvasImg(tempFilePaths, canvasWidth, canvasHeight, quality, callback) {
  39. var that = this;
  40. const ctx = wx.createCanvasContext('attendCanvasId');
  41. ctx.clearRect(0, 0, canvasWidth, canvasHeight);
  42. ctx.drawImage(tempFilePaths[0], 0, 0, canvasWidth, canvasHeight);
  43. ctx.draw(false, function () {
  44. wx.canvasToTempFilePath({
  45. canvasId: 'attendCanvasId',
  46. fileType: 'jpg',
  47. quality: quality,
  48. success: function success(res) {
  49. callback && callback(res)
  50. }, fail: function (e) {
  51. wx.showToast({
  52. title: '图片上传失败,请重新上传!',
  53. icon: 'none'
  54. })
  55. }
  56. });
  57. });
  58. },
  59. /**
  60. * 图片保存到相册
  61. */
  62. save(e) {
  63. let that = this;
  64. wx.saveImageToPhotosAlbum({
  65. filePath: that.data.imagePath,
  66. success: function (res) {
  67. console.log('图片已保存');
  68. },
  69. fail: function (res) {
  70. console.log('保存失败');
  71. }
  72. })
  73. },
  74. })

注意点

  1. 注意设置canvas-id='attendCanvasId'
  2. canvas要离屏渲染,就是移出屏幕之外,但是元素还是显示的,position: fixed;top: -9999px;left: -9999px; 不能使用 display: none; 这样是获取不到canvas元素的。

最后

h5页面中也有提供这样的方法

例如这样子:

  1. let canvas = document.createElement('canvas');
  2. let ctx = canvas.getContext('2d');
  3. ctx.drawImage(imagePath, 0, 0, w, h);
  4. canvas.toDataURL('image/jpeg', quality);
  5. 复制代码

需要的小伙伴也可以自己研究研究哈...

ok, 结束,

【微信小程序】图片压缩-纯质量压缩,非长宽裁剪压缩的更多相关文章

  1. 微信小程序--图片相关问题合辑

    图片上传相关文章 微信小程序多张图片上传功能 微信小程序开发(二)图片上传 微信小程序上传一或多张图片 微信小程序实现选择图片九宫格带预览 ETL:微信小程序之图片上传 微信小程序wx.preview ...

  2. 微信小程序图片上传和裁剪

    本篇博客用于解决微信小程序图片裁剪问题 图片裁剪常用于头像选择和图片合成等. 图片裁剪解决方案: 目前网络上知名的微信小程序图片裁剪插件是we-cropper(文末有链接) 操作步骤:下载好we-cr ...

  3. 微信小程序图片放大预览

    需求:当点击图片时,当前图片放大预览,且可以左右滑动 实现方式:使用微信小程序图片预览接口 我们可以看到api需要两个参数,分别通过下面的data-list和data-src来传到js中 wxml代码 ...

  4. 微信小程序 图片裁剪

    微信小程序 图片裁剪 分享一个微信小程序图片裁剪插件,很好用,支持旋转 文档:https://github.com/wyh19931106/image-cropper 1.json文件中添加image ...

  5. 微信小程序图片保存到本地

    微信小程序图片保存到本地是一个常用功能: 这里讲解下完整实现思路: 因为微信官方的授权只弹一次,用户拒绝后再次调用,就需要结合button组件的微信开放能力来调起,以下方案在微信各种授权中可参考. w ...

  6. 微信小程序图片上传并展示

    1.首先编写微信小程序的页面和样式: index.js var total = []; Page({ data: { perImgSrc: [] }, onLoad: function (option ...

  7. 5行代码实现微信小程序图片上传与腾讯免费5G存储空间的使用

    本文介绍了如何在微信小程序开发中使用腾讯官方提供的云开发功能快速实现图片的上传与存储,以及介绍云开发的 5G 存储空间的基本使用方法,这将大大提高微信小程序的开发效率,同时也是微信小程序系列教程的视频 ...

  8. 微信小程序图片选择,预览和删除

    这里均用的是小程序原生api 废话不多说直接上栗子: <view class="addImv"> <!--这个是已经选好的图片--> <view wx ...

  9. 关于微信小程序图片失真的解决方案

    今天来说一说 关于微信小程序的图片失真问题的解决,微信小程序的image标签要设置其宽高,不然图片若宽高过大会撑开原始图片大小的区域:如下 但是宽高设置固定了会导致有些图片和规定显示图片大小的比例不一 ...

随机推荐

  1. C++入门经典-例3.2-根据分数判断是否优秀

    1:代码如下: // 3.2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  2. winform Timer控件的使用

    private void button1_Click(object sender, EventArgs e){ Timer timer1 = new Timer(); timer1.Interval ...

  3. easyhook报错The given 64-Bit library does not exist

    在调用 RemoteHooking.Inject 时,报错 查看easyhook源代码,出错位置如下 if(!RtlFileExists(UserLibrary)) { #ifdef _M_X64 T ...

  4. Javadoc常见的标记和含义

    1.@param 方法参数的说明 2.@return 对 方法返回值的说明 3.@throws 方法抛出异常的描述 4.@version模块的版本号 5.see参数转向 6.@deprecated标记 ...

  5. go-ethereum开发问题

    1. abigen 参考文档(Native DApps: Go bindings to Ethereum contracts) abigen --sol token.sol --pkg token - ...

  6. BurpSuite(一)工具介绍

    , 本章目标: 1. 安装并配置好Burpsuite 2. 了解其各个模块功能 Burpsuite介绍 Burp Suite 是用于攻击web应用程序的集成平台.它包含了许多工具,并为这些工具设计了许 ...

  7. 如何实现在Eclipse导入MySQL驱动包

    1 右键项目->Properties->Java Build Path->Libraries->Add External JARs...->mysql-connector ...

  8. JS实战篇

    实现选项卡的选择: 效果图如下: 代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  9. 【HANA系列】SAP HANA 2.0 SPS00 SDA(Smart Data Access)连接Hadoop

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA 2.0 SPS ...

  10. tomcat报错解决方法

    tomcat报错如 关闭被占用的进程 解决方法:cmd进入控制台,输入命令netstat   -ano|findstr  8005 (什么端口号被占用就输入什么号),回车  发现是进程2044占用了这 ...