img标签加载src图片,图片逆时针旋转了90度,解决方案
问题描述:
手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在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度,解决方案相关推荐
- 关于Android 竖屏录制,在PC端播放被逆时针旋转了90度
更新: 事实上这是视频播放器的原因,使用自带播放器,win7上H264会被逆时针旋转90度,而win10上MPEG_4_SP会被逆时针旋转90度. 使用MediaRecorder录制视频,发现在PC端 ...
- img标签图片加载失败显示图片
img标签图片加载失败显示图片 onerror="οnerrοr=null;src='../../image/community/initialize_img.png'"
- Picturefill.WP – 根据屏幕尺寸加载合适的图片
Picturefill.WP插件利用picturefill.js脚本展示Responsive图片,即根据视口宽度选择尺寸合适的图片加载,节省带宽,提高网站载入速度.例如用户用手机访问站点,该插件会选择 ...
- ios wkweb设置图片_ios·WKWebView\UIWebView加载HTMLString,实现图片懒加载
背景: 项目中开发商品类型数据,数据可变性较大,所以商品详情数据存在文案和图片富文本显示,后台返回了html格式的数据供前端展示. 如果用webView直接显示的话,需要等html内容完全展示才能获取 ...
- htmlimg图片加载失败_img图片不存在显示默认图
在项目中,我们使用img标签加载图片,有时候图片地址有可能失效,获取路径问题,导致图片加载失败,img标签就会显示alt内容.这时候用户体验不是很好,所以就需要显示一张默认图片. 第一种方式:使用jq ...
- 小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道
一:小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序,也做了一些东西,随后便有了以下的一些总结了,现在说说如何使用小程序一次性上传多个本地相片. 问题描述 最近做项目的时候要实现一个上 ...
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】...
Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨 ...
- https访问http加载不出图片_前端解决第三方图片防盗链的办法
作者:biaochenxuying 转发链接:https://github.com/biaochenxuying/blog/issues/31 问题 笔者网站的图片都是上传到第三方网站上的,比如 简书 ...
- jquery 当页面图片加载之后_图片的懒加载和预加载
一.懒加载 [1.1]什么是懒加载? 懒加载也就是延迟加载,指的是在长网页中延迟加载图像,是一种很好优化网页性能的方式.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1 ...
最新文章
- (JAVA)从零开始之--打印流PrintStream记录日志文件
- static和不完全类型的一个例子
- 在物理内存中观察CLR托管内存及GC行为
- mysql8.0 密码认证插件_只需使用VS Code的REST客户端插件即可进行API调用
- Centos5上安装JRE和LUMAQQ
- Leetcode每日一题:169.majority-element(多数元素)
- Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
- Tatala 中文教程
- Atitit 知识聚合的方法大总结 目录 1. 什么是聚合 汇聚	1 2. 聚合化应用场景	2 2.1. 一站式	2 3. 知识聚合的历史与趋势
- 创建数据库常用SQL语句
- IMC IMV SecurityCenter连通
- 【毕业设计】基于stm32的智能温控风扇设计与实现 - 物联网 单片机
- 非确定有限自动机转换为确定有限自动机
- 看工业4.0道路上,美国和德国的不同路径
- CocosCreator 基于Assembler实现的图片切割破碎效果及自定义遮罩
- 服务器共享文件设成禁止删除,服务器共享文件夹权限 禁止删除共享文件方法...
- 使用tushare获取美股月收盘价
- 投稿经验分享之四:SCI投稿之JEI录用
- Microsoft Store无法显示错误,真正解决!
- html中图片动态效果代码,CSS3实现的图片动态交互效果
热门文章
- 开源前端脚本错误监控及跟踪解决项目BadJS试用
- NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
- 【重磅整理】提前看287篇ICLR-2021 深度强化学习领域论文得分汇总列表
- 前装ADAS单月搭载量创11个月以来新低,“缺芯”背后暗潮涌动
- 带通 带阻滤波器 幅频响应_滤波器原理,各式尽在掌握
- 越野越激情——“中国东川泥石流国际汽车越野赛”
- Stata如何查看某个变量中观测值一样的数据有多少个?
- android中gravity什么意思,【Android】“android:gravity”和“android:layout_gravity”属性解释...
- 智能电饭煲电路图及其原理_智能电饭煲工作原理图
- 致那些自嘲码农的苦逼程序员