问题描述:

手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题。

并且照片竖怕才会有此问题,横拍不存在。

原因分析:

手机拍照时,用相机拍摄出来的照片是含有EXIF信息的,在我们得到 UIImage时,可以查看此Image的imageOrientation属性,其实就是指的EXIF中的orientation信息。

如果我们忽略orientation信息,而直接对照片进行像素处理或上传等操作,得到的结果是翻转或者旋转90之后的样子。

这是因为我们执行像素处理或者drawInRect等操作之后,imageOrientaion信息被删除了,imageOrientaion被重设为0,造成照片内容和imageOrientaion不匹配。

所以,在对照片进行处理之前,先将照片旋转到正确的方向,保证返回的imageOrientaion为0。

//get original photo from iOS photos
//如果该图片大于2M,会自动旋转90度;否则不旋转
UIImage* originalImg=[dict objectForKey:UIImagePickerControllerOriginalImage];

原文:https://blog.csdn.net/hitwhylz/article/details/39518463

解决方法:

Swift版:

/**照片竖拍  web显示旋转解决:图片大于2M会自动旋转90度- parameter aImage: <#aImage description#>- returns: <#return value description#>*/class func fixOrientation(aImage:UIImage)->UIImage  {if aImage.imageOrientation == UIImageOrientation.Up{return aImage}var transform = CGAffineTransformIdentityswitch (aImage.imageOrientation) {case .Down,.DownMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height)transform = CGAffineTransformRotate(transform, CGFloat(M_PI))break;case .Left,.LeftMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))break;case .Right,.RightMirrored:transform = CGAffineTransformTranslate(transform, 0, aImage.size.height)transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))break;default:break;}switch (aImage.imageOrientation) {case .UpMirrored,.DownMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)transform = CGAffineTransformScale(transform, -1, 1)break;case .LeftMirrored,.RightMirrored:transform = CGAffineTransformTranslate(transform, aImage.size.height, 0)transform = CGAffineTransformScale(transform, -1, 1)break;default:break;}let ctx:CGContextRef = CGBitmapContextCreate(nil, Int(aImage.size.width), Int(aImage.size.height),CGImageGetBitsPerComponent(aImage.CGImage), 0,CGImageGetColorSpace(aImage.CGImage),1)!CGContextConcatCTM(ctx, transform)switch (aImage.imageOrientation) {case .Left,.LeftMirrored,.Right,.RightMirrored:CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage)break;default:CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);break;}let cgimg:CGImageRef = CGBitmapContextCreateImage(ctx)!let img:UIImage = UIImage(CGImage: cgimg)return img;}

OC版:  

- (UIImage *)fixOrientation:(UIImage *)aImage { // No-op if the orientation is already correct if (aImage.imageOrientation == UIImageOrientationUp)  return aImage; // We need to calculate the proper transformation to make the image upright. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored. CGAffineTransform transform = CGAffineTransformIdentity; switch (aImage.imageOrientation) { case UIImageOrientationDown: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height); transform = CGAffineTransformRotate(transform, M_PI); break; case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); transform = CGAffineTransformRotate(transform, M_PI_2); break; case UIImageOrientationRight: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, 0, aImage.size.height); transform = CGAffineTransformRotate(transform, -M_PI_2); break; default: break; } switch (aImage.imageOrientation) { case UIImageOrientationUpMirrored: case UIImageOrientationDownMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.width, 0); transform = CGAffineTransformScale(transform, -1, 1); break; case UIImageOrientationLeftMirrored: case UIImageOrientationRightMirrored: transform = CGAffineTransformTranslate(transform, aImage.size.height, 0); transform = CGAffineTransformScale(transform, -1, 1); break; default: break; } // Now we draw the underlying CGImage into a new context, applying the transform // calculated above. CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height, CGImageGetBitsPerComponent(aImage.CGImage), 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage)); CGContextConcatCTM(ctx, transform); switch (aImage.imageOrientation) { case UIImageOrientationLeft: case UIImageOrientationLeftMirrored: case UIImageOrientationRight: case UIImageOrientationRightMirrored: // Grr... CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage); break; default: CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage); break; } // And now we just create a new UIImage from the drawing context CGImageRef cgimg = CGBitmapContextCreateImage(ctx); UIImage *img = [UIImage imageWithCGImage:cgimg]; CGContextRelease(ctx); CGImageRelease(cgimg); return img; }

  

在完成拍照代理里,获取到图片后,用此方法处理后,再上传服务器,可解决该问题。

//若是图片var img:UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage//保存相册UIImageWriteToSavedPhotosAlbum(img, self, nil, nil)img = PublicMethod.fixOrientation(img)//压缩图片let imgData:NSData = UIImageJPEGRepresentation(img, 0.2)!//上传服务器self.uploadHeadImg(imgData, headImage: img)

img标签加载src图片,图片逆时针旋转了90度,解决方案相关推荐

  1. 关于Android 竖屏录制,在PC端播放被逆时针旋转了90度

    更新: 事实上这是视频播放器的原因,使用自带播放器,win7上H264会被逆时针旋转90度,而win10上MPEG_4_SP会被逆时针旋转90度. 使用MediaRecorder录制视频,发现在PC端 ...

  2. img标签图片加载失败显示图片

    img标签图片加载失败显示图片 onerror="οnerrοr=null;src='../../image/community/initialize_img.png'"

  3. Picturefill.WP – 根据屏幕尺寸加载合适的图片

    Picturefill.WP插件利用picturefill.js脚本展示Responsive图片,即根据视口宽度选择尺寸合适的图片加载,节省带宽,提高网站载入速度.例如用户用手机访问站点,该插件会选择 ...

  4. ios wkweb设置图片_ios·WKWebView\UIWebView加载HTMLString,实现图片懒加载

    背景: 项目中开发商品类型数据,数据可变性较大,所以商品详情数据存在文案和图片富文本显示,后台返回了html格式的数据供前端展示. 如果用webView直接显示的话,需要等html内容完全展示才能获取 ...

  5. htmlimg图片加载失败_img图片不存在显示默认图

    在项目中,我们使用img标签加载图片,有时候图片地址有可能失效,获取路径问题,导致图片加载失败,img标签就会显示alt内容.这时候用户体验不是很好,所以就需要显示一张默认图片. 第一种方式:使用jq ...

  6. 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

    一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...

  7. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...

     Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...

  8. https访问http加载不出图片_前端解决第三方图片防盗链的办法

    作者:biaochenxuying 转发链接:https://github.com/biaochenxuying/blog/issues/31 问题 笔者网站的图片都是上传到第三方网站上的,比如 简书 ...

  9. jquery 当页面图片加载之后_图片的懒加载和预加载

    一.懒加载 [1.1]什么是懒加载? 懒加载也就是延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1 ...

最新文章

  1. (JAVA)从零开始之--打印流PrintStream记录日志文件
  2. static和不完全类型的一个例子
  3. 在物理内存中观察CLR托管内存及GC行为
  4. mysql8.0 密码认证插件_只需使用VS Code的REST客户端插件即可进行API调用
  5. Centos5上安装JRE和LUMAQQ
  6. Leetcode每日一题:169.majority-element(多数元素)
  7. Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
  8. Tatala 中文教程
  9. Atitit 知识聚合的方法大总结 目录 1. 什么是聚合 汇聚 1 2. 聚合化应用场景 2 2.1. 一站式 2 3. 知识聚合的历史与趋势
  10. 创建数据库常用SQL语句
  11. IMC IMV SecurityCenter连通
  12. 【毕业设计】基于stm32的智能温控风扇设计与实现 - 物联网 单片机
  13. 非确定有限自动机转换为确定有限自动机
  14. 看工业4.0道路上,美国和德国的不同路径
  15. CocosCreator 基于Assembler实现的图片切割破碎效果及自定义遮罩
  16. 服务器共享文件设成禁止删除,服务器共享文件夹权限 禁止删除共享文件方法...
  17. 使用tushare获取美股月收盘价
  18. 投稿经验分享之四:SCI投稿之JEI录用
  19. Microsoft Store无法显示错误,真正解决!
  20. html中图片动态效果代码,CSS3实现的图片动态交互效果

热门文章

  1. 开源前端脚本错误监控及跟踪解决项目BadJS试用
  2. NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
  3. 【重磅整理】提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表
  4. 前装ADAS单月搭载量创11个月以来新低,“缺芯”背后暗潮涌动
  5. 带通 带阻滤波器 幅频响应_滤波器原理,各式尽在掌握
  6. 越野越激情——“中国东川泥石流国际汽车越野赛”
  7. Stata如何查看某个变量中观测值一样的数据有多少个?
  8. android中gravity什么意思,【Android】“android:gravity”和“android:layout_gravity”属性解释...
  9. 智能电饭煲电路图及其原理_智能电饭煲工作原理图
  10. 致那些自嘲码农的苦逼程序员