本人宝宝出生后,特地为宝宝做了一个网站,用于上传照片、视频,想着是自己的网站,因此在前端上传的时候没有进行压缩,同时又为了提高图片加载速度,所以在后台进行了压缩。列表中看压缩图,点击看原图。然而通过苹果手机上传的照片经常会遇到压缩后照片方向发生变化的问题,而查看原图却正常,特此记录解决办法。

经过百度,发现是苹果手机拍摄的照片中带有方向信息,而压缩后就丢失了。因此在压缩前就需要读取方向信息,并做相应的方向翻转。

安装扩展库

用于读取方向信息

go get github.com/rwcarlsen/goexif/exif

完整代码main.go

package mainimport ("image""image/jpeg""os""github.com/rwcarlsen/goexif/exif"
)func main() {src := "abc69678fae187df1b98ae5708e86583.jpeg"dst := "abc69678fae187df1b98ae5708e86583_thumb.jpeg"//通常只有 6,3,8 需要调整方向,所以不关心方向是否获取成功ori, _ := jpegOrientation(src)compress(ori, src, dst)}func compress(ori int, filename, dst string) error {sfp, err := os.Open(filename)if err != nil {return err}defer sfp.Close()img, _, err := image.Decode(sfp)if err != nil {return err}dfp, err := os.Create(dst)if err != nil {return err}var finalImg image.Image//只有 6,3,8 需要调整方向switch ori {case 6:finalImg = rotate90(img)case 3:finalImg = rotate180(img)case 8:finalImg = rotate270(img)default:finalImg = img}err = jpeg.Encode(dfp, finalImg, &jpeg.Options{Quality: 15,})return err
}//获取jpeg的方向信息
func jpegOrientation(src string) (int, error) {fp, err := os.Open(src)if err != nil {return 0, err}defer fp.Close()x, err := exif.Decode(fp)if err != nil {return 0, err}orientation, err := x.Get(exif.Orientation)if err != nil {return 0, err}ori, err := orientation.Int(0)return ori, err
}func rotate90(m image.Image) image.Image {n := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dy(), m.Bounds().Dx()))for x := m.Bounds().Min.Y; x < m.Bounds().Max.Y; x++ {for y := m.Bounds().Max.X - 1; y >= m.Bounds().Min.X; y-- {n.Set(m.Bounds().Max.Y-x, y, m.At(y, x))}}return n
}// 旋转180度
func rotate180(m image.Image) image.Image {n := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dx(), m.Bounds().Dy()))// 矩阵旋转for x := m.Bounds().Min.X; x < m.Bounds().Max.X; x++ {for y := m.Bounds().Min.Y; y < m.Bounds().Max.Y; y++ {//  设置像素点n.Set(m.Bounds().Max.X-x, m.Bounds().Max.Y-y, m.At(x, y))}}return n
}// 旋转270度
func rotate270(m image.Image) image.Image {n := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dy(), m.Bounds().Dx()))// 矩阵旋转for x := m.Bounds().Min.Y; x < m.Bounds().Max.Y; x++ {for y := m.Bounds().Max.X - 1; y >= m.Bounds().Min.X; y-- {// 设置像素点n.Set(x, m.Bounds().Max.X-y, m.At(y, x))}}return n
}

【golang】处理jpeg图片压缩后方向发生变化问题相关推荐

  1. 前端获取图片压缩后上传给后台

    在做移动端图片上传的时候,用户传的都是手机本地图片,而本地图片一般都相对比较大,拿iphone6来说,平时拍很多图片都是一两M的,如果直接这样上传,那图片就太大了,如果用户用的是移动流量,完全把图片上 ...

  2. js图片压缩后上传方法,图片超过1M先进行压缩,然后再上传

    js图片压缩后上传方法,图片超过1M先进行压缩,然后再上传 图片上传目录 js图片压缩后上传方法,图片超过1M先进行压缩,然后再上传 html代码 js代码 html代码 <input type ...

  3. java-png图片压缩,解决png图片压缩后背景变黑问题

    java-png图片压缩,解决png图片压缩后背景变黑问题 参考文章: (1)java-png图片压缩,解决png图片压缩后背景变黑问题 (2)https://www.cnblogs.com/yinj ...

  4. mozjpeg:JPEG图片压缩5%,获Facebook支持

    mozjpeg是一个来自Mozilla实验室的JPEG图像编码器项目,目标是在不降低图像质量且兼容主流的解码器的情况下,提供产品级的JPEG格式编码器来提高压缩率以减小JPEG文件的大小. Mozil ...

  5. JPEG图片压缩的Python实现

    文章目录 致谢 预备知识 Python代码 致谢 这学期有幸参加学习学校韩宇星教授的 数字图像工程(全英) 课程,对机器视觉了解更进一步,对韩老师引用世事洞明皆学问,人情练达即文章那节课印象颇深.课程 ...

  6. Bmob+Luban(鲁班)压缩图片实现相册选择图片压缩后上传到Bmob后台Glide加载图片显示到本地

    源代码已上传CSDN:https://download.csdn.net/download/qq_16519957/11068345 因为本章需要跟前面的知识结合起来看所以就做了一个前面链接方便大家查 ...

  7. 图片压缩后模糊怎么办 这5款无损压缩网站你要知道

    不少小伙伴一定有过过上传Gif动图提示动图体积过大的糟糕体验,同时还有MP4转Gif动图压缩率过高,导致图片模糊的看不清的体验.今天阿昊要推荐给大家的就是五款图片压缩&视频转换神器,无损! 1 ...

  8. 批量压缩图片软件-免费图片压缩后高清无损

    批量压缩图片软件,今天给大家分享一款批量压缩图片的软件,支持任意格式的图片压缩,不仅可以压缩图片还可以放大图片,支持批量图片自动水印.批量关键词采集全网图片,导入链接批量下载图片,整站图片下载导出.详 ...

  9. Compressor.js 图片压缩及方向修正

    目录 问题背景 解决方案 代码演示 更多应用,请访问官网 问题背景 现在用手机拍照上传图片的应用场景越来越多,但是手机拍照的图片现在都过大,十几兆的都不在少数,最关键的一点手机拍照的方向不同,图片最后 ...

最新文章

  1. python元组元素的提取比_Python 元组数据类型(tuple)详解 [访问元组元素][修改元组元素][删除元组][学习 Python 必备基础知识][看此一篇就够了]...
  2. Yii CGridView 基本使用(三)关联表相关字段搜索
  3. (65)如何根据句柄从二级、三级结构句柄表中找到内核对象
  4. C语言以递归实现归并排序Merge Sort算法(附完整源码)
  5. 二叉树的的前序遍历和后序遍历(题型变种更新中)
  6. java object monitor_Java精通并发-通过openjdk源码分析ObjectMonitor底层实现
  7. (Z)托尼?施瓦茨:六大关键几乎可以改变一切
  8. 使用Vue写一个登陆页面并在管理页面查看和修改
  9. 小米重磅新机Mimoji萌拍被指抄袭 官方怒回应:将追查到底!
  10. Fig. BPF Performance Tools Book
  11. Java EE 规范重命名为 Jakarta EE
  12. 首次运行 tensorflow 项目之 vgg 网络
  13. SQL Server中Text和varchar(max)数据类型区别
  14. PureMVC--一款多平台MVC框架
  15. matlab2c使用c++实现matlab函数系列教程-rot90函数
  16. Atitit WebDriver技术规范原理与概念
  17. ElasticSearch全文搜索引擎之入门以及环境搭建
  18. CS61C 学习笔记 --实时更新
  19. 往十年不忘初心,新十年不负韶华丨万字长文带你完整回顾2020数据技术嘉年华
  20. 新版标准日本语中级_第二十六课

热门文章

  1. 计算机专业笔记本低压,笔记本win7系统下CPU低压u和标压m的区别对比
  2. linux下搜索文件名,Linux系统中怎么搜索文件命令大全
  3. Codeforces868F Yet Another MinimizationProblem
  4. 修改 input checkbox(复选框) 选中的背景颜色 _@jie
  5. 一键复制吱口令,支付宝红包js代码
  6. python 开发窗体应用程序_Python如何编写窗体程序
  7. 基于C51实现数码管的显示
  8. 使用谷歌浏览器调试PC网页、手机APP
  9. JavaWeb - 软件开发的流程,综合案例
  10. 插入法排序c语言程序,C语言直接插入排序算法