CGImageCreateWithImageInRect 未正确裁剪

2023-12-09

我在使用 CGImageCreateWithImageInRect 裁剪照片时遇到了麻烦。我的应用程序让用户移动/放大图像直到它填满 316 x 316 视图,然后我希望它裁剪掉框外的任何区域并将图像保存为 UIImage。我通过取 x 和 y 图像视图原点的绝对值来确定裁剪原点,因为这使我回到包含图像视图的视图/框的 0,0。下面是代码:

    CGRect croppedRect = CGRectMake(fabs(widthDistanceToOrigin), fabs(HeightDistanceToOrigin), 316, 316);
    CGImageRef croppedImageRef = CGImageCreateWithImageInRect(image.CGImage, croppedRect); 
    UIImage *croppedImage = [UIImage imageWithCGImage: croppedImageRef scale: 1 / (imageScale) orientation: image.imageOrientation];
    CGImageRelease(croppedImageRef); 

这让我发疯,我就是无法让它裁剪我想要的区域。我已经让它正确缩放,但问题似乎出在裁剪矩形的 x 和 y 原点上,它与它应该采用的区域有很大的偏差(有时我会得到奇怪的结果)。

另外,似乎对于用手机摄像头拍摄的图像,我必须将裁剪矩形中的所有内容乘以 2 才能获得正确的尺寸。很奇怪。

所以我想知道,有谁知道如何解决这个问题,或者有没有人有更好的裁剪方法(请记住,我需要裁剪照片中的一个区域)。谢谢!


关于这个主题的帖子太多了,所有这些帖子都有相同的确切答案, 使用:CGImageCreateWithImageInRect 但它们都没有完全解决尝试裁剪的内容定位错误的问题。

然而,只有一条线索(深埋在内心深处)有一个其他人都忽略的小细节......如何在“宽高比”模式下将 UIImageView 裁剪为新的 UIImage?

输入的 'rect' 参数 CGImageCreateWithImageInRect(image.CGImage,croppedRect) 需要表示(取自)UIImage,而不是UIImageView。

这应该可以解决坐标系上定位错误的问题。

 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:   (NSDictionary *)info
 {
        oImage = [info valueForKey:UIImagePickerControllerOriginalImage];
        NSLog(@"Original Image size width: %f x height: %f", oImage.size.width, oImage.size.height);


        // crop image according to what the image picker view is displaying
        CGRect rect = CGRectMake(0, 40, 960.0f, 960.0f); // note: 960 x 1280 is what natively comes from capturing and image
        nImage = [BGViewModifiers cropImage:oImage inRect:rect];

        // scale image down for display and creating kombie
        CGSize size = CGSizeMake(320.0f, 320.0f);
        nImage = [BGViewModifiers imageFromImage:nImage scaledToSize:size];

        NSLog(@"New Image size width: %f x height: %f", [nImage size].width, [nImage size].height);
 }

 //ref: http://stackoverflow.com/a/25293588/2298002
 + (UIImage *)cropImage:(UIImage*)image inRect:(CGRect)rect
 {
    double (^rad)(double) = ^(double deg) {
       return deg / 180.0 * M_PI;
    };

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

  CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectApplyAffineTransform(rect, rectTransform));
  UIImage *result = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
  CGImageRelease(imageRef);

  return result;
 }

 + (UIImage*)imageFromImage:(UIImage*)image scaledToSize:(CGSize)newSize
 {
    UIGraphicsBeginImageContext( newSize );
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

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

CGImageCreateWithImageInRect 未正确裁剪 的相关文章

  • 如何在 iPhone 应用程序的 url 中传递字符串值

    NSURLRequest request NSURLRequest requestWithURL NSURL URLWithString http www krsconnect no community api html method ba
  • 我如何知道 UITableView 何时完成 ReloadData?

    我试图在执行完成后滚动到 UITableView 的底部 self tableView reloadData 我原本有 self tableView reloadData NSIndexPath indexPath NSIndexPath
  • 当 iPhone 设备方向朝上/朝下时,我可以判断它是横向还是纵向吗?

    我得到这个代码 如果设备处于左 右横向或上下颠倒状态 它会旋转并显示另一个视图控制器 但如果它的方向朝上或朝下 那么我如何判断它是横向模式还是纵向模式 因为我只想在它面朝上或朝下以及横向模式下旋转 void viewDidAppear BO
  • 我可以使用 NSDateFormatter 将此日期字符串转换为 NSDate 吗?

    我有这个字符串 2010 08 24T16 00 00 05 00 我想从中提取时间部分 即 16 00 并将其转换为 12 小时等效值 即下午 04 00 我正在尝试使用 NSDateFormatter 来完成此任务 但它不起作用 NSD
  • Swift NotificationCenter 删除观察者最快的方法

    我正在添加一些观察员viewController applicationWillResignActive applicationDidEnterBackground 以及许多其他人 我想删除self作为一行中所有已注册通知的观察者 我的问题
  • Apple 推送通知徽章编号

    我开发了服务器端应用程序 以在收到新通知后将徽章编号维护为递增或递减 并在看到通知后删除它工作正常 但是显示徽章时存在一些问题 实际情况是 在设备上收到新通知后 我单击取消按钮 然后徽章编号正确显示 但之后我将打开应用程序并关闭应用程序徽章
  • StoryBoard 2 导航控制器指向相同的视图

    有谁知道为什么这不起作用 这样 只有一个选项卡栏加载视图 另一个选项卡栏则显示黑屏 我在没有导航控制器的情况下尝试过 选项卡栏是正确的 而另一个在运行模式下不显示选项卡栏项目 如果有人感兴趣的话我对这个问题的回答 添加两个视图来启动我们感兴
  • 无法下载应用程序 - 此时无法下载“APP”

    我的应用程序有 PLUS 版本和常规版本 我使用不同的目标对它们进行存档 我将 ipa 上传到 TestFlight 也上传到我的曲棍球服务器 PLUS 版本总是下载得很好 但普通版本总是给我 无法下载应用程序 错误 我根本没有更改两个版本
  • 在 iPhone 和 Cocos2d 中从类类型(+)方法访问对象?

    我有一个类方法 在其中创建并返回类对象 但我想访问同一类中该对象的某些属性 作为一个类方法 我无法在 h 文件中声明该变量 然后在其他方法中访问它 以下是代码 我如何在下面的实例方法中访问 backsprite 或 hudlayer 对象的
  • 标签中的文字大小

    如何限制标签中的字符数 您可以通过设置自动截断带有省略号的文本frame of the UILabel NSInteger newSize 10 label frame CGRectMake label frame origin x lab
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 处理核心数据中的重复条目

    我有一个允许用户保存收藏夹的应用程序 我正在使用 Core Data 将收藏夹存储为托管对象 我已经编写了一些代码来防止存储重复项的可能性 但我想知道是否有更好的方法来做到这一点 每个收藏夹对象都有一个唯一的 ID 字段 在下面的代码中 我
  • Xcode 本地化设置中没有加号或减号按钮

    我需要在两天内翻译 iOS 应用程序 但我的 XCode 版本 4 4 和 4 5 Developer Preview 都没有给我添加其他语言的选项 我只能选择单击 Make localized 但我只能选择英语 选择它后 Xcode 中的
  • 为什么 iOS 5.0 不喜欢纯窗口应用程序?为什么它要求使用视图控制器?

    我有一个使用 Xcode 4 0 的 基于窗口的应用程序 模板创建的 iOS 应用程序 当时运行良好 并且使用的是 iOS 4 3 SDK 这是一个简单地将按钮 标签等直接放置到窗口上的应用程序 没有视图控制器 什么都没有 但现在我已经升级
  • insertObject:atIndex 的复杂性:

    复杂度是多少 NSArray insertObject atIndex N 或常数 另外 如何找出各种 Objective C 语句的复杂度 有一个在这里讨论 http www cocoadev com index pl NSMutable
  • 带约束的 Swift 动画

    是否可以通过改变约束来制作 UIView 动画 基本上 我想要动画myv UIView 具有 x y 高度和宽度约束 使用 UIView animateWithDuration 1 5 通过改变旧的限制 是的 这是可能的 你可以这样做 fu
  • iOS:addConstraints:应用程序崩溃

    Problem 我似乎无法在现有项目中采用自动布局 Details 我之前也遇到过与此问题相同的问题presentViewController 在 iOS 但所提供的答案都不是我的解决方案 我正在使用所有没有 xib 的故事板视图 我的 使
  • Apple Mach-O 链接器错误 armv7s 和 libGoogleAdMobAds.a

    我刚刚升级了我的应用程序以在新的 iPhone5 模拟器上运行 但是当我尝试为我的 iPhone 4S 设备构建它时 我收到此 Apple Mach O Liner 错误 ld 文件是通用的 3片 但不包含 n armv7s 切片 User
  • iPhone,如何将一张图像叠加到另一张图像上以创建要保存的新图像? (水印)

    基本上 我想拍摄用户从照片库中选择的图像 然后应用水印 即右下角的三角形 上面有应用程序名称 我已经在 Photoshop 中用透明层制作了第二张图像 我尝试了一个函数 我不记得它的确切名称 但它涉及 CGIImages 和蒙版 这将两个图
  • 将 Facebook 图片 URL 上传到 Firebase 存储

    我正在尝试将用户的 Facebook 个人资料图片上传到 Firebase 存储 let dictionary result as NSDictionary let data dictionary objectForKey data let

随机推荐

  • 如何修复python路径

    我的 Mac 上安装了 python 2 7 2 我使用 python 2 7 2 macosx10 6 dmg 安装 我只有一个 python 实例 当我在终端中输入查找 python 路径时 我得到以下信息 python Python
  • 如何确定 iOS 设备是否可以渲染特定表情符号?

    随着 iOS 9 1 的发布 我们获得了很多很酷的新表情符号 例如 taco 我正在开发一个应用程序 我想在支持新表情符号的设备上显示它们 但在不支持的设备上将它们隐藏 有没有办法确定给定的表情符号字符 包含在 NSString 中 是否可
  • unix 中两个时间戳相减的命令

    我正在编写一个脚本 它需要计算两个时间戳之间的差异 我已经进行了一些搜索 但到目前为止还没有得到任何线索 例如说 time1 20160314 10 16 27 time2 20160313 15 17 28 从上面我需要得到如下结果 区别
  • Apache Mod Rewrite - 将 : 字符替换为另一个字符

    我正在尝试将所有包含 的 URL 重写为另一个字符 http en wikipedia org wiki Filename Reserved characters and words Example http example com som
  • 使用高阶函数在 haskell 中使用参数进行排序

    嗨 我是 Haskell 初学者 我真的迷路了 这是我的作业 它要求我使用更高阶函数执行如下操作 Main gt mySort lt 1 5 3 6 4 1 3 3 2 1 1 2 3 3 3 4 5 6 Main gt mySort gt
  • 为什么字节+字节=int?

    看一下这段 C 代码 byte x 1 byte y 2 byte z x y ERROR Cannot implicitly convert type int to byte 任何数学运算的结果byte or short 类型隐式转换回整
  • Zend Framework 2 MVC 应用程序中的依赖关系管理

    由于 ServiceLocatorAwareInterface 可能是从 ZF3 中的 AbstractController 中删除 依赖项应该通过构造函数或 setter 方法传递 考虑到这一点 请考虑用户或站点控制器的用例 包括注册 激
  • 添加多个SQL选择的结果?

    我有三个 SQL 选择 我需要将它们的结果加在一起 这三个中的两个使用相当复杂的连接 select sum field one from t a join t b on t a bid t b id where t b user id id
  • 使用 jQuery 将文本添加到 asp.net 文本框控件

    在网络表单中我有一些输入字段 div div class forminput Label 1 br div div
  • .NET XmlDocument LoadXML 和实体

    将 XML 加载到 XmlDocument 时 即 XmlDocument document new XmlDocument document LoadXml xmlData 有什么办法可以阻止进程替换实体吗 我遇到了一个奇怪的问题 我在
  • shell for 循环中的 rsync [重复]

    这个问题在这里已经有答案了 我有这个 shell 脚本 bin sh PATHS a b c d for PATH in PATHS do rsync avziP home user PATH SERVER server folder b
  • Sublime Text 2 构建工具 - 没有任何反应

    我尝试使用 sublime text 2 编写 lua corona 程序 但遇到了问题 当我添加带有这样的文本的构建工具时 cmd C Program Files Corona Labs Corona SDK Corona Simulat
  • bmp 文件应该用于网站吗

    在网站上使用 bmp 文件时是否存在问题 文件大小除外 使用 2002 年后的浏览器或 Internet Explorer 没有问题 它们会显示它 IE 支持它和其他 你可以找到代码适用于 Mozilla Firefox and 适用于 C
  • 非 POD 元素类型“string”(又名“basic_string”)的可变长度数组 C++

    我在我的 C 代码中收到此错误 非 POD 元素类型的可变长度数组string aka basic string
  • 在 beforeunload/unload 上发送 Ajax 调用

    设想 我正在创建一个活动注册模块 用户可以在其中从日历中选择一个日期进行预订 填写一些输入字段并支付预订日期 其中一项要求是 每个日期只能预订一次 出现这样的情况 两个人想要在同一时间预订同一日期 因此 我们需要向后来预订日期的用户显示一条
  • Qt 布局 - 在调整大小时保持小部件的宽高比[重复]

    这个问题在这里已经有答案了 我想在 QGroupBox 上保持 16 9 的纵横比 下面屏幕截图左侧的那个 为了进行测试 我制作了一个简单的程序 其中有 4 个垂直布局的组框 全部为水平布局 main cpp include MainWin
  • Forth 语言 EBNF 规则用于无限循环或 if 语句

    有没有一个EBNF描述 Forth 无限循环或 if 语句的规则 EBNF用来描述syntax 无限循环或其他循环通常不属于它所描述的范围 因此 您将查看 EBNF 的无限循环 如下所示 indefinite loop BEGIN stat
  • 等待 CSV 文件打开?

    我正在尝试使用 Excel 中的 VBA 下载并打开 CSV 文件 当我使用调试器单步执行时 我的代码工作正常 但当我尝试正常运行它时 它无法工作 它试图将新打开的 CSV 文件中的信息复制到现有的 xlsm 文件中 但找不到任何事物 我已
  • R:如何访问tibble中的tibble?

    我正在读哈德利的 http r4ds had co nz tibbles html 然而 我仍然很难在小标题中引用小标题 gt library tidyquant gt f lt tq get F get key ratios gt f A
  • CGImageCreateWithImageInRect 未正确裁剪

    我在使用 CGImageCreateWithImageInRect 裁剪照片时遇到了麻烦 我的应用程序让用户移动 放大图像直到它填满 316 x 316 视图 然后我希望它裁剪掉框外的任何区域并将图像保存为 UIImage 我通过取 x 和