业务背景:私信聊天,需要发送图片,但是图片过大需要压缩处理。此时只有图片url,可以使用以下方法:canvasDataURL(url, 目标图片宽度,图片要显示区域的父元素)

注:该文件包含了input-file上传图片的情况(调用photoCompress)

// 压缩图片
export default {
methods:{
// 只有blob或者file形式的数据的情况直接调用此方法
// file:文件,w:目标宽度,objDiv:压缩后要放置的目标容器
photoCompress(file, w, objDiv){
var ready = new FileReader() // 异步文件读取机制
ready.readAsDataURL(file) // 图片预览
ready.onload = function(){
var re = this.result
this.canvasDataURL(re, w, objDiv)
}
},
// 只有图片url的情况直接调用此方法,re为url地址
canvasDataURL(re, w, objDiv){
var newImg = new Image()
newImg.src = re
var imgWidth,
imgHeight,
offsetX = 0,
offsetY = 0
// img的onload事件中同步执行绘制图像的函数,就可以一边装载一边绘制了
newImg.onload = function(){
var img = document.createElement("img")
img.src = newImg.src
imgWidth = img.width
imgHeight = img.height
var newHeight = Math.round(imgHeight * w / imgWidth) // 按比例计算压缩后的图片高度
var canvas = document.createElement("canvas")
canvas.width = w
canvas.height = newHeight
var ctx = canvas.getContext('2d')
// clearRect(x,y,width,height)
// 参数说明:x、y矩形起点的横纵坐标,width、height表示矩形宽高
ctx.clearRect(0,0,w,newHeight)
// 重置图片宽高为压缩后的宽高
imgWidth = w
imgHeight = newHeight
// drawImage(image,x,y,w,h)
// 参数说明:image-Image对象,x、y是绘制时该图像在画布中的起始坐标。w、h表示绘制时图像的宽高
// 该方法也可以复制图片某个区域:drawImage(image,sx,sy,sw,sh,dx,dy,dw,dh)
// 参数说明:image-Image对象,sx、sy是复制源图像中被复制区域的起点横纵坐标,sw、sh时候被复制区域的宽高
// dx、dy是表示复制后的目标图像在画布中的起始横纵坐标,dw,dh是复制后的目标图像的宽高
ctx.drawImage(img,offsetX,offsetY,imgWidth,imgHeight) // var base64 = canvas.toDataURL('img/png',0.7) // 参数表示:指定的图片类型,图片质量
// if(typeof objDiv === 'object'){
objDiv.appendChild(canvas)
// console.log(base64)
// } else if(typeof objDiv === 'function'){
// objDiv(base64)
// }
}
}
}
}

如有问题,请您指出~

最新文章

  1. C#基础篇 - 理解委托和事件
  2. javascript判断变量是不是空值
  3. 由360手机卫士谈起——让你的service获取最高权限。
  4. C++注意事项锦集
  5. 重设mysql的root密码,MAC OSX
  6. Open judge 06月度开销
  7. JS:九宫格抽奖转盘实例
  8. K - The Unique MST - poj 1679
  9. cocos2d-x2.2.5 + cocos2d-x3.2鸟跳便宜源代码“开源”
  10. TP5.0 PHPExcel 数据表格导出(原)
  11. sass学习--安装ruby
  12. Android之本地相冊图片选取和拍照以及图片剪辑
  13. Linux根目录详解-转自鸟哥的私房菜
  14. 1.5 PCI-X总线简介
  15. PyCharm的调试
  16. 构造函数,super()
  17. 辅助测试工具xip.io
  18. java.io.IOException: Can't read [\jre\lib\rt.jar]
  19. Arthas开源项目
  20. 实习培训——Java基础(1)

热门文章

  1. MySQL的InnoDB的细粒度行锁,是它最吸引人的特性之一。
  2. webstorm卡顿
  3. NodeJS学习(1)--- 安装配置介绍
  4. vue项目中使用阿里iconfont图标
  5. Tortoise SVN 提示 clean up 然而 clean up 没卵用的解决方法
  6. ef code first transform,add ef power tools add-in,add tangible t4 editor for enhancement.
  7. [LeetCode] Search Insert Position 二分搜索
  8. Android蓝牙介绍
  9. Ticket Lock, CLH Lock, MCS Lock
  10. CodeForces - 361D Levko and Array