canvas实现图片旋转

  • 前言
  • 代码

前言

在上一篇实现了 canvas实现压缩图片。现在有需求变了,需要将图片旋转,旋转后正确的显示图片的位置(不能被其他元素遮住),等比例显示图片。
简单的实现如下:
您可以点击:图片旋转

代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>图片旋转</title>
</head>
<body><input type="file" name="" id="file"><input type="button" value="下载" id="download"><input type="button" value="逆时针旋转" id="leftRotate"><input type="button" value="顺时针旋转" id="rightRotate"><div>图片压缩比:<span id="ratio"></span></div><script>const fileEl = document.querySelector('#file')const ratioEl = document.querySelector('#ratio')const downloadEl = document.querySelector('#download')const leftRotateEl = document.querySelector('#leftRotate')const rightRotateEl = document.querySelector('#rightRotate')const canvas = document.createElement('canvas')const ctx = canvas.getContext('2d')const body = document.body// 压缩后的图片urllet compressUrl = ''// 压缩后的目标宽度和高度let targetWidth, targetHeight// 下载的图片类型const FILE_TYPE = 'image/jpeg'// 最大上传文件大小const MAX_SIZE = 3 * 1024 * 1024// 上传文件类型const FILE_TYPES = ['image/jpeg', 'image/png']// 上传文件最大宽度const MAX_WIDTH = 1024// 上传文件最大高度const MAX_HEIGHT = 1024// 上传文件最大宽高比const MAX_WH_RATIO = MAX_WIDTH / MAX_HEIGHT// 重置function resetEl () {const imgArr = body.querySelectorAll('img')imgArr.forEach(v => {body.removeChild(v)})ratioEl.innerHTML = ''}// 将文件转成base64function convertFile2base64 (file) {return new Promise((resolve, reject) => {let reader = new FileReader()reader.addEventListener('load', e => {resolve(e.target.result)reader = null})reader.readAsDataURL(file)})}// 压缩图片function compress (url) {const img = new Image()img.src = url// body.appendChild(img)img.addEventListener('load', e => {const {width: originWidth, height: originHeight} = e.target// 原始宽高比const originWHRatio = originWidth / originHeighttargetWidth = originWidthtargetHeight = originHeight// 1、计算上传图片压缩后的宽高// 2、绘制压缩后的图片// 3、上传if (originWidth > MAX_WIDTH || originHeight > MAX_HEIGHT) {if (originWHRatio > MAX_WH_RATIO) {// 图片更宽targetWidth = MAX_WIDTHtargetHeight = Math.round(targetWidth / originWHRatio)} else {// 图片更高targetHeight = MAX_HEIGHTtargetWidth = Math.round(targetHeight * originWHRatio)}}// 图片压缩比const ratio = originWidth / targetWidthconst newImg = document.createElement('img')newImg.id = 'newImg'ratioEl.innerHTML = ratiocanvas.width = targetWidthcanvas.height = targetHeightctx.clearRect(0, 0, targetWidth, targetHeight)// 绘制压缩的图片ctx.drawImage(img, 0, 0, targetWidth, targetHeight)// 获取 Data UrlcompressUrl = canvas.toDataURL(FILE_TYPE);newImg.src = compressUrlnewImg.addEventListener('load', () => {body.appendChild(newImg)})// body.appendChild(canvas)})}fileEl.addEventListener('change', e => {resetEl()const [file] = e.target.filesif (!file) returnconst {size: fileSize, type: fileType} = fileconsole.warn('file', file, fileSize, MAX_SIZE,  fileType);if (!FILE_TYPES.includes(fileType)) {alert('只能上传图片')fileEl.value = ''return}if (fileSize > MAX_SIZE) {alert('图片不能超过3M')fileEl.value = ''return}convertFile2base64(file).then(res => {compress(res)})})downloadEl.addEventListener('click', () => {if (!compressUrl) returnconst a = document.createElement('a')a.href = compressUrla.style.display = 'none'a.download = '图片'body.appendChild(a)a.click()a.remove()})leftRotateEl.addEventListener('click', e => {const newImg = document.querySelector('#newImg')canvas.width = newImg.heightcanvas.height = newImg.widthctx.clearRect(0, 0, newImg.height, newImg.width)ctx.translate(0, canvas.height);ctx.rotate(270 * Math.PI / 180)ctx.drawImage(newImg, 0, 0, newImg.width, newImg.height)compressUrl = canvas.toDataURL(FILE_TYPE)newImg.src = compressUrl})rightRotate.addEventListener('click', e => {const newImg = document.querySelector('#newImg')canvas.width = newImg.heightcanvas.height = newImg.widthctx.clearRect(0, 0, newImg.height, newImg.width)ctx.translate(canvas.width, 0);ctx.rotate(90 * Math.PI / 180)ctx.drawImage(newImg, 0, 0, newImg.width, newImg.height)compressUrl = canvas.toDataURL(FILE_TYPE)newImg.src = compressUrl})</script>
</body>
</html>

canvas实现图片旋转相关推荐

  1. canvas签名图片旋转

    canvas签名图片旋转 前言 一.实现思路 二.详细代码 总结 前言 当使用canvas完成横屏签名功能时,最后签名图片需要旋转角度,保证图片横铺 一.实现思路 思路是重新创建应该canvas,将图 ...

  2. html让图片自动旋转360,html5 canvas 360图片旋转制作抽奖转盘代码

    特效描述:html5canvas 360图片旋转 抽奖转盘代码.60图片旋转制作抽奖转盘代码 代码结构 1. HTML代码 var colors = ["#B8D430", &qu ...

  3. IE下及标准浏览器下的图片旋转(二)—— Canvas(1)

    文章过长,一篇无法保存. IE下及标准浏览器下的图片旋转(一)--滤镜,CSS3 3. canvas canvas 是html5中的新标签,使用canvas之前我们先看下它的定义:<canvas ...

  4. IE下及标准浏览器下的图片旋转(二)—— Canvas(2)

    文章过长,一篇无法保存 IE下及标准浏览器下的图片旋转(二)-- Canvas(1) 同样,作为最后,我们使用使用jquery也为canvas写个旋转demo: javascript: $(funct ...

  5. canvas在舞台上点击后图片旋转_Canvas-图片旋转

    众所周知canvas是位图,你可以在里面渲染你要的东西,不过你只能操作canvas的属性来进行编辑.就是说你并不能操作画进canvas的东西,例如我在canvas里添加一幅画,我现在想将那幅画移动10 ...

  6. 图片(旋转/缩放/翻转)变换效果(ccs3/滤镜/canvas)

    以前要实现图片的旋转或翻转,只能用ie的滤镜来实现,虽然canvas也实现,但ie不支持而且不是html标准. css3出来后,终于可以用标准的transform来实现变换,而canvas也已成为ht ...

  7. web手势库AlloyFinger运用( 控制CANVAS中图片移动、缩放、旋转) - 可编辑图片指定区域位置

    注: 苹果手机升级IOS14.1系统后,出现图片写入不了CANVAS画布问题 解决方法:alloy_paper.js 文件查找代码: this.img.crossOrigin = "Anon ...

  8. 移动端 canvas 横屏 签名 图片旋转

    学习与 前端实现电子签名 是通过原生canvas实现,我这篇是对其进行了改造,记录一下 效果图 组件 components/esign.vue <template><div styl ...

  9. canvas图片旋转,图片base64编码,保存图片

    在一些业务场景中,常常需要前端对图片进行操作,这样可以将部分的性能压力转移到前端设备,有利于减小服务器压力,下面讲解前端怎么操作图片. 首先,对图片的操作都是依赖于canvas画布,这里对canvas ...

最新文章

  1. 什么样的人适合学习UI?
  2. 免费下载!200+讲者核心观点公布!2021最强AI学术会议视频全部回放
  3. Unix高级环境编程—进程控制(一)
  4. Linux电源管理(10)_autosleep
  5. arcgis js api proxy java 版本配置
  6. 【项目实战课】基于Pytorch的3DCNN视频分类与行为识别实战
  7. Swift之字符串String的常规操作和处理
  8. 如何成批导入数据到 kitten编程猫 类型为列表的变量中
  9. android系统设置在哪里,android-如何在系统settings里添加设置选项
  10. android 多个语音合成,android实现语音合成
  11. zabbix的trigger
  12. JVM调优总结(转)
  13. 新年2021HTML,2021年了,来一段新年快乐的挂件源码
  14. 连接mysql_spring boot连接mysql提示The server time zone value xxx错误
  15. HEVC播放器出炉,迅雷看看支持H.265
  16. 音频文件如何转换成文字?
  17. win10系统装服务器2008蓝屏,win10专业版系统出现蓝屏的原因及解决方法
  18. 微软扩大与Meta的AI合作,强强联合,友商岌岌可危?
  19. 笔记本启动显示0xc000014c错误--提示缺失win10/system32内部文件
  20. python识别物体大小_Python-OpenCV —— 物体识别(TrainCascadeClassification)

热门文章

  1. 互联网公司背后的“深套路”:恶意举报对手,假招聘骗取信息
  2. Windows10 鼠标无法使用 USB receiver
  3. vep加密视频破解转换翻录为mp4教程
  4. 价值几千行代码的一键安装开源啦,欢迎各位领导莅临指导(贡献代码)
  5. 假如你有超能力,会复活哪部经典美剧?
  6. linux右键无法解压gz文件夹,Linux/centos下zip、tar、gz压缩解压命令
  7. 排序算法——冒泡排序(Bubble Sort)
  8. wordpress图像大小_如何在WordPress中添加图像积分(逐步操作)
  9. 如何在MacBook Pro上使用原彩显示功能?
  10. python中len用法_简单介绍Python中的len()函数的使用