1. - (UIImage *)fixOrientation:(UIImage *)aImage {
  2. // No-op if the orientation is already correct
  3. if (aImage.imageOrientation == UIImageOrientationUp)
  4. return aImage;
  5. // We need to calculate the proper transformation to make the image upright.
  6. // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.
  7. CGAffineTransform transform = CGAffineTransformIdentity;
  8. switch (aImage.imageOrientation) {
  9. case UIImageOrientationDown:
  10. case UIImageOrientationDownMirrored:
  11. transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
  12. transform = CGAffineTransformRotate(transform, M_PI);
  13. break;
  14. case UIImageOrientationLeft:
  15. case UIImageOrientationLeftMirrored:
  16. transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
  17. transform = CGAffineTransformRotate(transform, M_PI_2);
  18. break;
  19. case UIImageOrientationRight:
  20. case UIImageOrientationRightMirrored:
  21. transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
  22. transform = CGAffineTransformRotate(transform, -M_PI_2);
  23. break;
  24. default:
  25. break;
  26. }
  27. switch (aImage.imageOrientation) {
  28. case UIImageOrientationUpMirrored:
  29. case UIImageOrientationDownMirrored:
  30. transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);
  31. transform = CGAffineTransformScale(transform, -1, 1);
  32. break;
  33. case UIImageOrientationLeftMirrored:
  34. case UIImageOrientationRightMirrored:
  35. transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);
  36. transform = CGAffineTransformScale(transform, -1, 1);
  37. break;
  38. default:
  39. break;
  40. }
  41. // Now we draw the underlying CGImage into a new context, applying the transform
  42. // calculated above.
  43. CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
  44. CGImageGetBitsPerComponent(aImage.CGImage), 0,
  45. CGImageGetColorSpace(aImage.CGImage),
  46. CGImageGetBitmapInfo(aImage.CGImage));
  47. CGContextConcatCTM(ctx, transform);
  48. switch (aImage.imageOrientation) {
  49. case UIImageOrientationLeft:
  50. case UIImageOrientationLeftMirrored:
  51. case UIImageOrientationRight:
  52. case UIImageOrientationRightMirrored:
  53. // Grr...
  54. CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);
  55. break;
  56. default:
  57. CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);
  58. break;
  59. }
  60. // And now we just create a new UIImage from the drawing context
  61. CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
  62. UIImage *img = [UIImage imageWithCGImage:cgimg];
  63. CGContextRelease(ctx);
  64. CGImageRelease(cgimg);
  65. return img;
  66. }

IOS 拍照旋转修正的更多相关文章

  1. 图片上传前 压缩,base64图片压缩 Exif.js处理ios拍照倒置等问题

    曾写过在前端把图片按比例压缩不失真上传服务器的前端和后台,可惜没有及时做总结保留代码,只记得js利用了base64位压缩和Exif.js进行图片处理,还有其中让我头疼的ios拍照上传后会倒置等诸多问题 ...

  2. 【转】IOS设备旋转的内部处理流程以及一些【优化建议】

    加速计是整个IOS屏幕旋转的基础,依赖加速计,设备才可以判断出当前的设备方向,IOS系统共定义了以下七种设备方向: typedef NS_ENUM(NSInteger, UIDeviceOrienta ...

  3. iOS 图片旋转方法

    iOS 图片旋转方法 通过 CGImage 或 CIImage 旋转特定角度 UIImage可通过CGImage或CIImage初始化,初始化方法分别为init(cgImage: CGImage, s ...

  4. iOS拍照定制之AVCaptureVideoDataOutput

    问题 领导看了前面做的拍照,问了句"哪来的声音", "系统的,自带的,你看系统的拍照也有声音" "有办法能去掉吗?挺糟心的" "我 ...

  5. iOS拍照图片旋转的问题

    很久之前,遇到了这种情况,iOS某端拍照上传到服务器,其他iOS端从服务器下载该照片展示,发现图片逆时针旋转了90度.当时百度了一下,找到一段代码修正image方向,问题解决了,但没有深入理解底层原理 ...

  6. iOS拍照上传后,在web端显示旋转 Swift+OC版解决方案

    问题描述: 手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题. 并且照片竖怕才会有此问题,横拍不存在. 原因分析: 手机拍照时,用相机拍摄出来 ...

  7. vue 上传图片视频组件,可拍照选择照片,解决苹果手机拍照旋转问题

    1.创建组件components > uploadImg > index.vue <template> <input type="file" name ...

  8. iOS拍照定制之AVCapturePhotoOutput

    问题 领导安排任务,写个拍照功能,界面跟系统拍照有点出入 拍完照片,底部显示已拍照片,有个拍照上限[在此不论] 点击已拍照片,可以预览.放大缩小查看 思路 系统拍照肯定不行了,只能定制,没提是否拍照禁 ...

  9. vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理

    一.前言 三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习. 图片的上传之前都是用的插件(ajaxupload), ...

随机推荐

  1. 迁移11g Rac中OCR和VOTEDISK

    环境:OEL+oracle rac 11.2.0.3 迁移描述:将ocr和votedisk从+DATE上迁移到+OCR_VOTE上: 操作如下: [root@ora2 ~]$ /u01/app/11. ...

  2. <摘录>MBR和分区表

    MBR 意思是主引导记录.位于硬盘的0柱面.0磁头.1扇区. MBR 大小为1个扇区,512字节. 下面是MBR的结构: 偏移                                    构 ...

  3. FireFox插件SQLite Manager的使用

    最近几天开始高IOS数据库来着,一开始就CoreData的学习,结果高了一天没有一点进展. 没法,还是先老实代码着吧,不过用的火狐插件可视化数据库的操作也是不错的似乎. FireFox 插件:SQLi ...

  4. CUDA编程札记

    const int N = 33 * 1024; const int threadsPerBlock = 256; const int blocksPerGrid = imin( 32, (N+thr ...

  5. Telnet服务配置

    telnet:远程连接,使用未加密的用户/密码组进行验证,由xinetd服务管理.配置文件为/etc/xinetd.d/telnet Telnet服务的配置步骤如下: 一.安装telnet软件包 #r ...

  6. 微信公众平台开发小记(ASP.NET)

    微信的好东西,提供了很大的平台去发挥,公司最近推出微信公众账号,也接触了一些东西, 最终决定用asp.net来开发服务端程序. 微信公众平台的API很简单,利用XML来规范格式,并且所有的数据都在CD ...

  7. MySQL数据库如何与EXCEL的XLS格式相互转换

    1 将SQL导出为EXCEL方法,有如下数据库(my_impa),里面有两张表 2 如果是EXCEL格式,一定要勾选"将字段名称放在首行",否则待会儿导入的时候就需要你手工新建字段 ...

  8. BitConverter.GetBytes(int)和BitConverter.ToString 方法 (Byte[])

    BitConverter.ToString 方法 (Byte[]) 网址:https://msdn.microsoft.com/zh-cn/library/3a733s97(v=vs.110).asp ...

  9. vue - (v-pre、v-cloak、v-once)

    1.v-pre,不和绑定的数据冲突,也就是不用它们的值 2.v-cloak,和css样式一起用,vue渲染未完成不显示 3.v-once,只渲染DOM第一次渲染的值,以后不会改变了(你不要刷新网页,然 ...

  10. 一学就会之ado.net(一)

    ado.net十一组用于和数据源进行交互的面向对象类库.数据源能够是数据库也能够是文本文件.excel表格或者XML文件. 简单来说.ado.net就是与不同的数据源进行交互(增删改查)的. ado. ...