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. iOS 日志管理异常捕获组件LFLogManager

    一.功能 1.分级打印保存 解决一大堆重要.不重要打印信息在控制台混为一团的尴尬局面.可设置仅打印某级别及以上的信息.分为5类打印: DDLogError(@"打印并保存特别重要信息&quo ...

  2. HMAC的JAVA实现和应用

    1.简介: HMACSHA1 是从SHA1 哈希函数构造的一种键控哈希算法,被用作 HMAC(基于哈希的消息验证代码). 此 HMAC 进程将密钥与消息数据混合,使用哈希函数对混合结果进行哈希计算,将 ...

  3. Linux上安装使用SSH(ubuntu&&redhat)

    转自:http://blog.csdn.net/zxs9999/article/details/6930736 Ubuntu安装使用SSH ubuntu默认并没有安装ssh服务,如果通过ssh链接ub ...

  4. [转]Configure a Package to Use Transactions SSIS

    本文转自:http://msdn.microsoft.com/en-us/library/ms141144.aspx When you configure a package to use trans ...

  5. @RestController和@Controller的差异

    SpringMVC现在使用越来越普及,在使用注解写控制器中发现,需要控制器页面跳转时,需要对类注解为@Controller,而此时,使用freemarker时,在类中写的restful接口会报cann ...

  6. Indirect Buffers

    间接cmd 用在 gpu建立的cmd 不需要cpu参与 用indirect cpu gpu就不会互相等待了 直接gpu建立了 gpu用 之前的cmd是cpu建立 填入数据 gpu拿来执行的 在meta ...

  7. hdu-Coins

    http://acm.hdu.edu.cn/showproblem.php?pid=2844 Problem Description Whuacmers use coins.They have coi ...

  8. 如何在 Ubuntu 上搭建网桥

    导读作为一个 Ubuntu 16.04 LTS 的初学者.如何在 Ubuntu 14.04 和 16.04 的主机上搭建网桥呢?顾名思义,网桥的作用是通过物理接口连接内部和外部网络.对于虚拟端口或者 ...

  9. 转:关于android webview实践的文章集合

    http://blog.csdn.net/jiangqq781931404/article/category/2681765

  10. c语言指针详解 经典

    指针是C语言中广泛使用的一种数据类型. 运用指针编程是C语言最主要的风格之一.利用指针变量可以表示各种数据结构: 能很方便地使用数组和字符串: 并能象汇编语言一样处理内存地址,从而编出精练而高效的程序 ...