在 iOS 7 上纵向裁剪图像会导致方向错误

2024-01-15

我有以下功能,在 iOS 7 和 XCode 5 之前它按预期工作。该函数采用图像和cropSize。该图像是要裁剪为指定尺寸的图像,该尺寸由 CGSizecropSize 定义。该函数的目的是将图像裁剪到一定大小,然后返回裁剪后的图像。

    - (UIImage *) cropImage:(UIImage *)originalImage cropSize:(CGSize)cropSize
{


    //calculate scale factor to go between cropframe and original image
    float SF = originalImage.size.width / cropSize.width;

    //find the centre x,y coordinates of image
    float centreX = originalImage.size.width / 2;
    float centreY = originalImage.size.height / 2;

    //calculate crop parameters
    float cropX = centreX - ((cropSize.width / 2) * SF);
    float cropY = centreY - ((cropSize.height / 2) * SF);

    CGRect cropRect = CGRectMake(cropX, cropY, (cropSize.width *SF), (cropSize.height * SF));

    CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], cropRect);


    //keep orientation if landscape
    UIImage *newImage;

    if (originalImage.size.width > originalImage.size.height || originalImage.size.width == originalImage.size.height) {
        newImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:originalImage.imageOrientation];
    }
    else
    {
        newImage = [UIImage imageWithCGImage:imageRef];
    }

    CGImageRelease(imageRef);

    //Now want to scale down cropped image!
    //want to multiply frames by 2 to get retina resolution
    CGRect scaledImgRect = CGRectMake(0, 0, (cropSize.width * 2), (cropSize.height * 2));

    UIGraphicsBeginImageContextWithOptions(scaledImgRect.size, NO, [UIScreen mainScreen].scale);

    [newImage drawInRect:scaledImgRect];

    UIImage *scaledNewImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledNewImage;

}

问题是,对于传入的横向 UIImage 来说一切正常,图像按预期裁剪,但是如果传入的图像是纵向拍摄的,则生成的图像(scaledNewImage 中的裁剪结果) ) 侧面旋转 90 度,这是我不想要的。

就好像肖像图像正在以风景形式进行处理一样 - 因此该功能将应该是肖像方向的图像裁剪为风景而不是肖像。
如果裁剪区域是正方形,则这一点并不那么明显,但是如果要裁剪的区域是横向矩形,那么它会沿着纵向的长度而不是宽度进行裁剪。希望我说得有道理!

这个问题在 iOS 7 和 XCode 5 之前没有发生过。所以我不确定到底发生了什么变化。任何帮助表示赞赏,谢谢。


在此处答案的帮助下解决了这个问题:https://stackoverflow.com/a/14712184/521653 https://stackoverflow.com/a/14712184/521653

- (UIImage *) cropImage:(UIImage *)originalImage cropSize:(CGSize)cropSize
{
    NSLog(@"original image orientation:%d",originalImage.imageOrientation);

    //calculate scale factor to go between cropframe and original image
    float SF = originalImage.size.width / cropSize.width;

    //find the centre x,y coordinates of image
    float centreX = originalImage.size.width / 2;
    float centreY = originalImage.size.height / 2;

    //calculate crop parameters
    float cropX = centreX - ((cropSize.width / 2) * SF);
    float cropY = centreY - ((cropSize.height / 2) * SF);

    CGRect cropRect = CGRectMake(cropX, cropY, (cropSize.width *SF), (cropSize.height * SF));

    CGAffineTransform rectTransform;
    switch (originalImage.imageOrientation)
    {
        case UIImageOrientationLeft:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(M_PI_2), 0, -originalImage.size.height);
            break;
        case UIImageOrientationRight:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI_2), -originalImage.size.width, 0);
            break;
        case UIImageOrientationDown:
            rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(-M_PI), -originalImage.size.width, -originalImage.size.height);
            break;
        default:
            rectTransform = CGAffineTransformIdentity;
    };
    rectTransform = CGAffineTransformScale(rectTransform, originalImage.scale, originalImage.scale);

    CGImageRef imageRef = CGImageCreateWithImageInRect([originalImage CGImage], CGRectApplyAffineTransform(cropRect, rectTransform));
    UIImage *result = [UIImage imageWithCGImage:imageRef scale:originalImage.scale orientation:originalImage.imageOrientation];
    CGImageRelease(imageRef);
    //return result;

    //Now want to scale down cropped image!
    //want to multiply frames by 2 to get retina resolution
    CGRect scaledImgRect = CGRectMake(0, 0, (cropSize.width * 2), (cropSize.height * 2));

    UIGraphicsBeginImageContextWithOptions(scaledImgRect.size, NO, [UIScreen mainScreen].scale);

    [result drawInRect:scaledImgRect];

    UIImage *scaledNewImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return scaledNewImage;

}

这就是那里更新的方法。我实现了链接到我的方法的答案中的代码,它解决了问题。奇怪的是我在 iOS 7 之前没有这些!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 iOS 7 上纵向裁剪图像会导致方向错误 的相关文章

随机推荐

  • Pandas 通过切片计算复合年增长率

    给定以下数据框 df pd DataFrame A 1 2 3 7 B 7 6 5 4 C 5 6 7 1 D 1 9 9 8 df df set index A df B C D A 1 7 5 1 2 6 6 9 3 5 7 9 7 4
  • Azure Docker Web 应用程序上的“启动文件”

    docker web 应用程序选项上的 启动文件 选项是docker compose文件 或者 shell 命令 我找不到任何相关文档 基本上我希望我的网络应用程序运行docker compose yml当我将图像推送到它时 而不是执行 d
  • 如何使用 Fabric 创建 postgresql 用户

    我想为我的设置 Fabric 脚本创建一个数据库用户 但 createuser 具有交互式密码输入功能 并且接缝不喜欢 Fabric 用 Fabric 示例来扩展答案 In fabfile py def create database Cr
  • 在 TextMate 中折叠全部

    有没有办法折叠 TextMate 中给定 php 文件中的所有函数 例如我有两种方法 function index Sample code function beforeFilter Sample Code 我希望能够发出一个命令 其中所有
  • 用户没有访问数据库的权限

    我正在尝试使用 Windows 身份验证连接到数据库 我相信我当前的用户无权访问它 如何让用户登录 SQL Server 并使用数据库 您需要使用 SQL Server Management Studio 程序来授予用户访问权限 您需要使用
  • git-p4:致命:构建 git 时不支持 git-p4 (NO_PYTHON=1)

    我正在尝试在我的 Linux 计算机上使用 git p4 但由于某种原因 git p4 似乎有问题 当我运行 git p4 命令时 我得到 fatal git was built without support for git p4 NO
  • 长时间运行的 PHP 脚本在通过 exec() 调用时停止,但在通过 CLI 调用时完成

    我有一堆脚本需要很长时间才能完成 其中一些可能需要长达 20 分钟 有一个 Bash 脚本可以执行这些 PHP 脚本 当我以 root 身份通过 CLI 调用此 Bash 脚本时 所有 PHP 脚本都会顺利完成 但是 当我通过浏览器使用 P
  • 安装 Eclipse 的 ADT 插件

    我正在尝试为 Eclipse 安装 ADT 插件 但是 当我进入 安装新软件 并输入插件位置后https dl ssl google com android eclipse https dl ssl google com android e
  • Delphi - 窗体中的窗体

    出于美观原因 我想在另一个表单之上显示一个表单 就像它是一个组件一样 比如 TPanel 它应该随父级一起调整大小 当父级被标题栏拖动时四处移动 等等 main form component 1 main the embedded form
  • 悬停时反转关键帧动画

    这是一个演示 http codepen io Tiger0915 pen GgjVLN http codepen io Tiger0915 pen GgjVLN 我有一个keyframe动画开启hover of the circle分区当您
  • 如何从 Terraform 中的地图中删除与键值匹配的值

    我有一个如下所示的示例地图 并且正在尝试删除任何具有与 bong 匹配的 key2 值的帐户 所以起始地图看起来像这样 sample map account1 key1 foo key2 bar account2 key1 bing key
  • 在 MVC 4.0 中的部分视图中使用节

    当我需要在特定元素上初始化 jQuery ui 时 我想在部分视图中包含脚本 它确实属于部分而不是包含页面或布局 据说 MVC 4 中有一种方法可以做到这一点 但我似乎找不到任何有关它的信息 我也有类似的问题 希望这可以帮助 我们希望有一个
  • 如何使用node-mysql而不将所有行加载到内存中?

    我正在使用 NodeJS 我想对 1 000 000 行执行某些操作 而不将所有行加载到内存中 对于每个 之前 当我使用 ASP Classic 时 我这样做 do while not rec eof do something rec mo
  • 将模板渲染为字符串?

    是否可以将模板 渲染 为字符串 我想使用一个模板并填充一些值 然后我必须将这些值保存到本地磁盘 渲染方法总是将模板发送到客户端 我想要类似于运行模板的东西 但将模板的输出保存到可以存储在本地文件系统中的本地字符串变量 它比你想象的更简单 d
  • 使用 Google Cloud Storage 的文档管理系统

    我目前正在研究 Google App Engine 的不同方面 仍处于研究阶段 构建了一些小型应用程序并将其部署在云上 最近 当我为云存储 即 gsUtil 安装命令行时 我遇到了云存储的版本控制支持 并且能够通过 gsUtil 检索旧对象
  • 如何强制我的 C# Windows 窗体使用阿拉伯数字?

    我试图强制我的表单使用阿拉伯格式 例如将 1 2 3 4 等 数字显示为 在我的所有形式中 无论它是Textbox orlables或者无论它是什么 我搜索并发现了很多关于这个问题的问题 其中大多数都不起作用 而我认为其他的似乎不是很好的答
  • 通过 Outlook (RDCOMclient) 将 R Markdown 输出作为正文电子邮件发送

    刚刚学习 R Markdown 语言 想知道我是否可以通过 Outlook 从 R 发送正文电子邮件中的输出 使用 RDCOMClient 我的办公室不使用 gmail 谢谢 根据 Ben 的回答 到处出现的奇怪符号可能是由 R 和 Out
  • Android Widget 随机停止工作

    我已经解决这个问题三天了 我已经查看了这里的每个问题以寻求答案 我有一个带有按钮的小部件 我希望它做的就是每次单击它时启动一项服务 问题是按钮随机停止工作 我根本无法重现它 也不知道是什么原因造成的 我的服务调用 stopSelf 但我的广
  • 用于匹配/查找单元格中字符串的一部分是否等于给定范围内的值并返回该值的公式

    我在 Excel 的两列中有两个文本范围 如下所示 A B C 1 Mazda Mazda6 i Escape 2 Ford F150 XL Pathfinder 3 Ford Freestar SEL
  • 在 iOS 7 上纵向裁剪图像会导致方向错误

    我有以下功能 在 iOS 7 和 XCode 5 之前它按预期工作 该函数采用图像和cropSize 该图像是要裁剪为指定尺寸的图像 该尺寸由 CGSizecropSize 定义 该函数的目的是将图像裁剪到一定大小 然后返回裁剪后的图像 U