iOS拍照后图片自动旋转90度的完美解决方法

发布时间 - 2026-01-10 22:04:18    点击率:

今天开发一个拍照获取照片的功能的时候, 发现上传之后图片会自动旋转90.

测试发现, 只要是图片大于2M, 系统就会自动翻转照片

  相机拍照后直接取出来的UIimage(用UIImagePickerControllerOriginalImage取出),它本身的imageOrientation属性是3,即UIImageOrientationRight。如果这个图片直接使用则没事,但是如果对它进行裁剪、缩放等操作后,它的这个imageOrientation属性会变成0。此时这张图片用在别的地方就会发生旋转。imageOrientation是只读的,不能直接修改其值。

解决方法如下:

1. 设置相机的一个属性allowsEditing为YES,设了这个值,你拍完照片后会在照片上出现一个框框,这就是对照片的裁剪编辑。在相机的代理方法中取照片的时候就别用UIImagePickerControllerOriginalImage来取了,要用UIImagePickerControllerEditedImage。用这个key取出来的照片,它的imageOrientation是0,所以之后的任何裁剪、缩放操作都不会造成旋转。这是第一种方法。

2. 第一种解决方法基本没用, 开发中基本都会对图片进行裁剪和压缩. 这里有一个专门针对这个事的很好的category

+ (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) {
    caseUIImageOrientationDown:
    caseUIImageOrientationDownMirrored:
      transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
      transform = CGAffineTransformRotate(transform, M_PI);
      break;
    caseUIImageOrientationLeft:
    caseUIImageOrientationLeftMirrored:
      transform = CGAffineTransformTranslate(transform, aImage.size.width,0);
      transform = CGAffineTransformRotate(transform, M_PI_2);
      break;
    caseUIImageOrientationRight:
    caseUIImageOrientationRightMirrored:
      transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);
      transform = CGAffineTransformRotate(transform, -M_PI_2);
      break;
    default:
      break;
  }
  switch (aImage.imageOrientation) {
    caseUIImageOrientationUpMirrored:
    caseUIImageOrientationDownMirrored:
      transform = CGAffineTransformTranslate(transform, aImage.size.width,0);
      transform = CGAffineTransformScale(transform, -1, 1);
      break;
    caseUIImageOrientationLeftMirrored:
    caseUIImageOrientationRightMirrored:
      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) {
    caseUIImageOrientationLeft:
    caseUIImageOrientationLeftMirrored:
    caseUIImageOrientationRight:
    caseUIImageOrientationRightMirrored:
      // 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 = [UIImageimageWithCGImage:cgimg];
  CGContextRelease(ctx);
  CGImageRelease(cgimg);
  return img;
}

以上所述是小编给大家介绍的iOS拍照后图片自动旋转90度的完美解决方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# ios拍照旋转90度  # ios电子书翻页效果代码详解  # iOS实现翻页效果动画实例代码  # iOS图片界面翻页切换效果  # iOS实现日历翻页动画  # 实例讲解iOS中的UIPageViewController翻页视图控制器  # iOS开发中使用屏幕旋转功能的相关方法  # iOS开发中控制屏幕旋转的编写方法小结  # IOS手势操作(拖动、捏合、旋转、点按、长按、轻扫、自定义)  # iOS渐变圆环旋转动画CAShapeLayer CAGradientLayer  # iOS基于CATransition实现翻页、旋转等动画效果  # 就会  # 解决方法  # 小编  # 这是  # 很好  # 在此  # 这就是  # 会在  # 这张  # 给大家  # 要用  # 会对  # 种方法  # 用在  # 对它  # 所述  # 第一种  # 给我留言  # 就别  # 感谢大家 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 详解jQuery中的事件  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  长沙做网站要多少钱,长沙国安网络怎么样?  米侠浏览器网页图片不显示怎么办 米侠图片加载修复  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  如何在云指建站中生成FTP站点?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  EditPlus中的正则表达式实战(6)  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel怎么多语言本地化设置_Laravel语言包翻译与Locale动态切换【手册】  html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】  Python文件操作最佳实践_稳定性说明【指导】  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何快速搭建高效WAP手机网站?  php 三元运算符实例详细介绍  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  微信推文制作网站有哪些,怎么做微信推文,急?  html5的keygen标签为什么废弃_替代方案说明【解答】  在线教育网站制作平台,山西立德教育官网?  网站制作免费,什么网站能看正片电影?  node.js报错:Cannot find module 'ejs'的解决办法  如何用花生壳三步快速搭建专属网站?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何快速启动建站代理加盟业务?  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  如何快速上传建站程序避免常见错误?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  想要更高端的建设网站,这些原则一定要坚持!  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  高端云建站费用究竟需要多少预算?  WEB开发之注册页面验证码倒计时代码的实现  原生JS获取元素集合的子元素宽度实例  Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】  Laravel如何使用Collections进行数据处理?(实用方法示例)  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  JavaScript如何实现路由_前端路由原理是什么  浅析上传头像示例及其注意事项  如何快速选择适合个人网站的云服务器配置?  Python文件异常处理策略_健壮性说明【指导】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  javascript日期怎么处理_如何格式化输出  Laravel如何升级到最新版本?(升级指南和步骤)  如何在阿里云虚拟服务器快速搭建网站?  如何快速查询网站的真实建站时间?  如何用低价快速搭建高质量网站?