图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,
jepg图片上传后,换取的url在web的image标签上显示被旋转、
实例:iphone6ps竖拍图片原图上传显示
看图软件打开:
图片为正:
上传后,在image标签内显示为逆时针旋转90度。
此问题在移动端也会出现
因此,决定再上传文件后,由后端统一处理
解决思路:
1、使用exif工具,判断当前图片的Orientation值。
2、将被旋转图片改变其Orientation值后上传,并兑换图片链接,在各个平台显示。
Orientation参数含义:
参数 | 0行(未旋转上) | 0列(未旋转左) | 旋转(方法很多) |
1 | 上 | 左 | 0° |
2 | 上 | 右 | 水平翻转 |
3 | 下 | 右 | 180° |
4 | 下 | 左 | 垂直翻转 |
5 | 左 | 上 | 顺时针90°+水平翻转 |
6 | 右 | 上 | 顺时针90° |
7 | 右 | 下 | 顺时针90°+垂直翻转 |
8 | 左 | 下 | 逆时针90° |
package mainimport ("bytes""fmt""image""image/jpeg""io/ioutil""math""os""code.google.com/p/graphics-go/graphics""github.com/rwcarlsen/goexif/exif"
)// png图片没有Orientation信息
func ReadOrientation(filename string) int {file, err := os.Open(filename)if err != nil {fmt.Println("failed to open file, err: ", err)return 0}defer file.Close()x, err := exif.Decode(file)if err != nil {fmt.Println("failed to decode file, err: ", err)return 0}orientation, err := x.Get(exif.Orientation)if err != nil {fmt.Println("failed to get orientation, err: ", err)return 0}orientVal, err := orientation.Int(0)if err != nil {fmt.Println("failed to convert type of orientation, err: ", err)return 0}fmt.Println("the value of photo orientation is :", orientVal)return orientVal
}func RotateImage(src []byte, angle int) ([]byte, error) {var img, _, err = image.Decode(bytes.NewReader(src))//var img, err = GetImage(src)if err != nil {return src, err}angle = angle % 360//弧度转换radian := float64(angle) * math.Pi / 180.0cos := math.Cos(float64(radian))sin := math.Sin(radian)//原图的宽高w := float64(img.Bounds().Dx())h := float64(img.Bounds().Dy())//新图高宽W := int((math.Max(math.Abs(float64(w*cos-h*sin)), math.Abs(w*cos+h*sin))))H := int((math.Max(math.Abs(w*sin-h*cos), math.Abs(w*sin+h*cos))))dst := image.NewNRGBA(image.Rect(0, 0, W, H))err = graphics.Rotate(dst, img, &graphics.RotateOptions{radian})if err != nil {return src, err}file, err := os.Create("newImage.jpg")if err != nil {return src, err}defer file.Close()err = jpeg.Encode(file, dst, &jpeg.Options{50})if err != nil {return src, err}return nil, nil
}func main() {ori := ReadOrientation("bebRotated.jpg")//先读取该图片的原始方向,方向值参考上图,data, err := ioutil.ReadFile("bebRotated.jpg")根据方向值,旋转图片if err != nil {fmt.Println(err)return}fmt.Println(ori)//根据图片原始信息的Orientation判断需要转多少度if ori == 6 {RotateImage(data, 90)}if ori == 3 {RotateImage(data, 180)}if ori == 8 {RotateImage(data, 270)}}
其中使用到"code.google.com/p/graphics-go/graphics"
是翻墙后下载到本地的
资源
图片上传被旋转,golang Exif 判断.jepg图片原始信息Orientation方向,并旋转,相关推荐
- php网页中不能上传图片,为什么我的PHP图片上传代码可以实现插入数据库但图片不能插入文件夹中?...
为什么我的PHP图片上传代码可以实现插入数据库但图片不能插入文件夹中? 关注:167 答案:4 mip版 解决时间 2021-01-19 00:58 提问者慢慢学会遗忘 2021-01-18 00 ...
- kindeditor扩展粘贴截图功能修改图片上传路径并通过webapi上传图片到图片服务器...
2019独角兽企业重金招聘Python工程师标准>>> kindeditor是一个非常好用的富文本编辑器,它的简单使用我就不再介绍了. 而kindeditor却对图片的处理不够理想. ...
- 图片上传并保存到数据库以及显示图片
图片上传并保存到数据库以及显示图片 此处是用保存图片相对路径的方法,上传图片. 1. 首先创建数据库表: create table images ( image_ID int primary key ...
- html结构转图片上传服务器并实现点击复制图片到剪贴板
html结构转图片上传服务器并实现点击复制图片到剪贴板 总结 主要实现了将前端页面上某区域的页面html结构通过html2canvas插件转换成canvas对象,通过canvas对象的toDataUR ...
- java多图片上传插件,Bootstrap中的fileinput 多图片上传及编辑功能
Bootstrap中的fileinput 多图片上传及编辑功能 2019-01-01 编程之家收集整理的这篇文章主要介绍了Bootstrap中的fileinput 多图片上传及编辑功能,编程之家小编觉 ...
- PS修改过图片上传服务器,富文本编辑器图片上传base64存数据库改为服务器图片路径...
目录 一.安装依赖 npm install quill-image-super-solution-module --save PS:如果不想npm引入可以直接把quill-image-super-so ...
- java 二进制图片上传_Spring MVC上传图片,Java二进制图片写入数据库,生成略缩图...
背景描述:最近做到一个项目,有个商品登记功能.登记的信息包括:基本信息若干(文字信息):图片信息,要求将图片保存到数据表中的image字段(sql server 数据库) 步骤:1.将图片上传到服务器 ...
- php flash 图片上传,Flash教程:flash+php实现图片上传
本文主要向大家介绍了flash+php实现图片上传,通过具体的代码向大家展示,希望对大家学习Flash教程有所帮助. flash负责打开browser,浏览我的电脑: 这里我们需要的flash方法有: ...
- php多图片上传到数组,input type=file多图片上传 原生html传递的数组集合
单个的input type="file"表单也是可以实现多图片上传的 代码如下: 这里要给file表单加上一个multiple属性 multiple="multiple& ...
最新文章
- 三十六、请求分页管理方式
- 智能车竞赛技术报告 | 智能车视觉 - 中国地质大学(武汉) - 2021 地大乘风队
- ASP.NET 2.0的编译模型
- 套接字选项SO_LINGER
- NAPTR和SRV记录
- SEGW activation check bypass via debugging
- 结构专业规范大全_1.2万篇 建筑行业规范大全套!速来!
- 安装openCV到VS2010,Win764位机时遇到的问题的解决办法
- 表变量是什么_DAX学习:使用VAR定义变量
- Windows Mobile 5.0
- 全部博文集锦第三期CHM文件,及十三个经典算法研究PDF文档
- 项目管理实践之版本控制工具SVN
- Redis结合Lua脚本实现高并发原子性操作
- 最小二乘法曲线拟合(c++实现)
- android模拟器中关闭应用进程
- 七甲川染料CY7标记海藻酸钠|CY7-海藻酸钠|alginate-peg-Cyanine7
- 硬件选型之如何看光耦器件的开关频率
- 如何确认RNA的质量?附RNA提取实验方法技巧分析
- cnpm安装淘宝镜像
- sh文件加密解密gzexe(Cannot decompress $0)