在开始之前需要了解为什么在浏览器中图片会自动旋转,在一些相机设备中因手持方向的原因导致图片会有一个旋转角度,在浏览器中旋转角度被忽略了,导致图片看过去是旋转的

图片旋转如下

如图
1 正常
6 旋转90°
8 旋转-90°
3 旋转180°

既然知道了图片需要旋转的角度,那么只需要通过canvas旋转并绘制图片,然后将图片输出就行,这里需要借助exif-js获取图片的源信息,只需要判断 Orientation 然后旋转对应的角度,废话不多说上代码

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>body{padding-left: 300px;}.preivew {width: 300px;}.preivew2 {width: 300px;}</style><!-- 这里采用cdn形式引入exif --><script src="https://cdn.jsdelivr.net/npm/exif-js"></script>
</head><body><input type="file" accept="image/*" /><p>转换前</p><img class="preivew" /><p>转换后</p><img class="preivew2" />
</body></html><script>// 添加input事件监听document.querySelector('input').addEventListener('change', onFileChange)function onFileChange(event) {let file = event.target.files[0] // 得到file对象document.querySelector('.preivew').src = URL.createObjectURL(file) // 转换前的imgrotateImg(file).then(blob => {document.querySelector('.preivew2').src = URL.createObjectURL(blob) // 转换后的img// 上传获取到的blob对象// let fromData = new fromData()// fromData.appendChild('file',blob)// $.ajax({//     type: "method",//     url: "url",//     data: "data",//     dataType: "dataType",//     success: function (response) {//     }// });/**这里把转换后的blob对象下载在电脑上查看,实际开发中忽略*/const url = window.URL.createObjectURL(blob)const link = document.createElement('a')link.href = urllink.setAttribute('download', 'AAAAAA')document.body.appendChild(link)link.click()document.body.removeChild(link)window.URL.revokeObjectURL(url)})}function rotateImg(file) {return new Promise((resolve, reject) => {let img = new Image();img.src = window.URL.createObjectURL(file);img.onload = () => {// 获取图片源数据 上面已经引入EXIF全局变量EXIF.getData(img, function () {// 获取图片orientation值console.log(EXIF.getAllTags(this))let orientation = EXIF.getTag(this, "Orientation");let canvas = document.createElement("canvas");let ctx = canvas.getContext("2d");switch (orientation) {case 3: // 旋转180°canvas.width = img.width;canvas.height = img.height;ctx.rotate((180 * Math.PI) / 180);ctx.drawImage(img, -img.width, -img.height, img.width, img.height);break;case 6: // 旋转90°canvas.width = img.height;canvas.height = img.width;ctx.rotate((90 * Math.PI) / 180);ctx.drawImage(img, 0, -img.height, img.width, img.height);break;case 8: // 旋转-90°canvas.width = img.height;canvas.height = img.width;ctx.rotate((-90 * Math.PI) / 180);ctx.drawImage(img, -img.width, 0, img.width, img.height);break;default: // 没有源信息的图片和正常的图片是不需要旋转的canvas.width = img.width;canvas.height = img.height;ctx.drawImage(img, 0, 0, img.width, img.height);break;}// 处理完返回 (这里返回都是被压缩的,根据实际情况更改正常的图片处理方式)canvas.toBlob(file => resolve(file), 'image/jpeg', 0.92)})}})}
</script>

看看效果

前端解决图片在浏览器中旋转问题相关推荐

  1. 前端下载图片 在浏览器中

    这篇文章很好:https://blog.csdn.net/weixin_44244857/article/details/105549543 使用了文章文中base64 方法 <el-butto ...

  2. 解决安卓微信浏览器中location.reload 或者 location.href失效的问题

    解决安卓微信浏览器中location.reload 或者 location.href失效的问题 参考文章: (1)解决安卓微信浏览器中location.reload 或者 location.href失 ...

  3. Hbuilder中的图片在浏览器中无法显示

    Hbuilder中的图片在浏览器中无法显示 在尝试把它放到记事本中来操作时,发现图片的名字都太复杂了,于是又转场来到Hbuilder把图片重命名成简单的数字,一波操作后,再打开浏览器就可以了 如果标题 ...

  4. JSP中img标签图片在浏览器中不显示问题

    在开发JSP工程中遇到一个问题,在Eclipse中可以看到<img>的图片,但在浏览器去看不到.<img>的src用的是绝对路径,如:E:/JSP/workspace/test ...

  5. 隐藏的图片在浏览器中的请求

    图片在页面中一般会以两种形式出现:img元素或者背景图片. 那么在img或者使用背景图片的元素被隐藏之后,页面加载的时候浏览器会不会发送http请求加载图片呢? 注:隐藏分为两种情况(display: ...

  6. vscode的插入的图片在浏览器中无法显示

    图片可以正常打开,但在浏览器中无法显示,查了f12说是找不到定义,我是个小白,也不会处理,求求大佬解答,在此感谢不尽.

  7. html5返回上一页不刷新,javascript解决在safari浏览器中使用history.back()返回上一页后页面不会刷新的问题...

    我们知道,在JavaScript中提供了一个window.history.back()方法用于返回上一页,另外也可以使用window.history.go(-1)返回上一页(跳转). 在其他的主流浏览 ...

  8. 前端解决图片跨域问题:net::ERR_BLOCKED_BY_RESPONSE.NotSameOrigin

    前言 项目中使用了从别的网站上面获取的图片url,在项目中展示报错 net::ERR_BLOCKED_BY_RESPONSE.NotSameOrigin 200 从network中可以看到有请求报CO ...

  9. 微信播放在服务器视频无法播放音乐,解决ios微信浏览器中audio和video音乐视频无法自动播放等问题...

    产生问题的原因 参考网址:点击 对于自动播放的局限性,没有变通方案.正如前面所提及的,音频流只能从用户触摸事件加载.当针对移动版 Safari 进行开发时,重要的一点是要在必要时调整您的工作流,以适应 ...

最新文章

  1. VC字体安装相关方法总结
  2. BaseAction
  3. 计划任务工具cron 的配置和说明
  4. 20. 有效的括号 golang 堆栈
  5. mysql 主主互备实现
  6. java程序服务不能启动不了_JavaService.exe注册的windows服务无法启动问题
  7. Spring Boot(2)---Spring Boot文档及其导航说明
  8. Android UI--自定义ListView(实现下拉刷新+加载更多)
  9. 闲谈IPv6-体会一下移动IP路由扩展头以及地址选项头的实际操作(Howto)
  10. 谈 heuristic
  11. 【树莓派】树莓派官方系统Raspbian安装 Docker 和 青龙面板 挂JD库脚本 --详细教程,Centos和Ubuntu服务器可参考
  12. WannaCry感染文件恢复方法_企业再也不用愁了!
  13. phpstorm License Server激活 官网下载版本直接激活
  14. dq坐标系下无功功率表达式_基于瞬时电流分解的谐波电流检测方法研究
  15. %2d、%6d(c语言)
  16. SVG黑科技微信排版『层层左右交错滑开』模板代码
  17. python制作闯关答题软件_Pygame制作答题类游戏的实现
  18. js 判断数组中是否包含某个元素
  19. UVa 109 - SCUD Busters(凸包计算)
  20. 安装教程 | Eric7安装与配置

热门文章

  1. 获得 NextDate 【明天】
  2. 介绍9种常用的项目管理工具
  3. adb interface找不到驱动程序_打印机驱动程序无法使用怎么办 打印机驱动安装方法【介绍】...
  4. 单层感知机实现布尔函数,附代码
  5. 接收Http请求的几种方式
  6. 苹果手机怎么把中文翻译英文
  7. Linux学习--rsync+inotify实现自动同步
  8. webGl应用场景有哪些
  9. java 匿名内部类存储泛型参数,即类型参数
  10. 电力系统暂态稳定仿真/simulink仿真 simulink搭建单机无穷大系统进行暂态稳定性仿真