使用CGContextDrawImage绘制图片上下颠倒
首先要说的是,在iOS的不同framework中使用着不同的坐标系 :
UIKit - y轴向下
Core Graphics(Quartz) - y轴向上
OpenGL ES - y轴向上
UIKit是iPhone SDK的Cocoa Touch层的核心framework,是iPhone应用程序图形界面和事件驱动的基础,它和传统的windows桌面一样,坐标系是y轴向下的; Core Graphics(Quartz)一个基于2D的图形绘制引擎,它的坐标系则是y轴向上的;而OpenGL ES是iPhone SDK的2D和3D绘制引擎,它使用左手坐标系,它的坐标系也是y轴向上的,如果不考虑z轴,在二维下它的坐标系和Quartz是一样的。
现在回到问题,当通过CGContextDrawImage绘制图片到一个context中时,如果传入的是UIImage的CGImageRef,因为UIKit和CG坐标系y轴相反,所以图片绘制将会上下颠倒。解决方法有以下几种
解决方法一:在绘制到context前通过矩阵垂直翻转坐标系
- // uiImage是将要绘制的UIImage图片,width和height是它的宽高
- CGContextTranslateCTM(context, 0, height);
- CGContextScaleCTM(context, 1.0, -1.0);
- CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage);
解决方法二:使用UIImage的drawInRect函数,该函数内部能自动处理图片的正确方向
- // uiImage是将要绘制的UIImage图片,width和height是它的宽高
- UIGraphicsPushContext( context );
- [uiImage drawInRect:CGRectMake(0, 0, width, height)];
- UIGraphicsPopContext();
解决方法三:垂直翻转投影矩阵
这种方法通过设置上下颠倒的投影矩阵,使得原本y轴向上的GL坐标系看起来变成了y轴向下,并且坐标原点从屏幕左下角移到了屏幕左上角。如果你习惯使用y轴向下的坐标系进行二维操作,可以使用这种方法,同时原本颠倒的图片经过再次颠倒后回到了正确的方向:
- // uiImage是将要绘制的UIImage图片,width和height是它的宽高
- // 图片被颠倒的绘制到context
- CGContextDrawImage(context, CGRectMake(0, 0, width, height), uiImage.CGImage);
- // 设置上下颠倒的投影矩阵(则原来颠倒的图片回到了正确的方向)
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- glOrthof( 0, framebufferWidth, framebufferHeight, 0, -1, 1 );
相关推荐
资源名称:iOS开发视频教程资源目录:【】iOS开发视频教程-第01讲-iOS历史介绍【】iOS开发视频教程-第02讲-XCode安装【】iOS开发视频教程-第03讲-UIView_PPT【】iOS开发视频教程-第04讲-UILabel【】iOS开发视频教程-...
在iOS平台上,开发美图应用的关键在于理解和掌握图形图像处理技术。本文主要聚焦于iOS的图形处理框架,特别是Quartz 2D和Core Image,它们是实现图片编辑、滤镜和界面美化的核心工具。 首先,Quartz 2D是iOS中的2D...
在iOS开发领域,掌握进阶技术是提升个人技能的关键步骤,这将使你从众多开发者中脱颖而出。"iOS开发进阶篇-成为一个iOS开发高手"这份资料正为此目标提供了全面的指导。它深入探讨了iOS开发的核心概念和技术,旨在...
资源名称:【iOS开发源码系列】图像处理源代码资源目录:【】【iOS图像】360-Degree-Panorama-master【】【iOS图像】AGMedallionView-master【】【iOS图像】AGSimpleImageEditorView-master【】【iOS图像】...
### UI第一章:无限互联iOS开发教程课件 -- iPhone开发入门 #### iOS系统概述与架构 - **iOS系统**:作为苹果公司专为iPhone、iPod touch及iPad设计的操作系统,iOS自诞生以来就以其简洁易用的特点受到全球用户的...
之前遇到的需求,ios上没有类似的实现。搞了好久在网上搜了很多资料都不能解决最后找到了一个c/c++的底层源码,才实现了最后整理了下上传了。是个ios的demo很详细你定能看懂的。运行在xcode环境下,关键算法的文件是...
2. **iOS兼容性**:vuforia-sdk-ios-7-1-31明确指出它适用于iOS 7.1版本及以上,这意味着开发者可以利用这个SDK为运行iOS 7.1及更高版本的iPhone和iPad创建AR应用。然而,随着新版本的iOS系统不断更新,开发者需要...
【Object-C】ios苹果app开发入门object-c例子demo14个实例 一般编程问题 【实例简介】 ios苹果app开发入门,object-c,例子,demo,14个实例 初学者难得的学习实例 【实例截图】 【核心代码】 归档 ├── Air...
根据提供的信息,我们可以推断出这是一本关于iOS开发进阶的书籍,作者为唐巧。虽然提供的部分内容似乎并不是实际的章节内容,但从标题、描述和标签中,我们可以推测本书可能涵盖的一些关键知识点。 ### iOS开发进阶...
《iOS实例开发源码——iliu-ios-cocos2d-viking-cba07f8》 这个压缩包文件“iliu-ios-cocos2d-viking-cba07f8.zip”显然包含了iOS平台上一个基于Cocos2D的游戏或应用的源代码。Cocos2D是一个广泛使用的2D游戏开发...
这个项目,"swift-iOS-CoreML-Yolo",是专为iOS设备设计的,利用强大的机器学习能力来识别和定位图像中的特定对象。下面我们将详细探讨这个过程涉及的关键知识点。 首先,我们要理解CoreML是什么。CoreML是Apple...
这个项目"ios-表盘绘制-swift.zip"是基于Swift编程语言实现的一个可自定义的表盘视图,它包含了指针动画功能,用户可以根据自己的需求进行修改。以下是对该项目的详细解析: 首先,我们要了解Swift语言。Swift是...
思科 cisco ios 镜像 C3640-JK.BIN 文件由多位CCIE水平人员测试使用后拷贝,dy下可用
一个对绘制【折线图】、【直方图】进行封装的 Demo,主要用 CAShaperLayer 和 UIBezierPath 来实现,使用方法简单,感兴趣的可以看一下,顺便给个 Star ~~ Git地址: https://github.com/luoguilin/LGLChart
通过摘取整体框架中的核心逻辑,并简化代码实现过程,保留核心功能如IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容的实现细节,读者将获得对iOS开发核心原理的深入认识。 适合人群:具备一定编程基础,...
资源名称:iPhone开发入门到精通视频教程资源目录:【】iOS开发源码系列---工具【】iOS开发源码系列---应用【】iOS开发源码系列---游戏【】iOS开发源码系列---类库与框架【】iOS开发真机测试与发布【】iOS开发视频...
第一部分介绍iOS 开发的常用工具,第二部分介绍iOS开发中的一些常见的实践经验,第三部分介绍iOS 开发中涉及的原理。 如果把成为iOS 开发高手的过程比作武侠小说中的修炼过程的话,工具、实践和理论的学习就分别对应...
在iOS开发中,图片离线鉴黄是一项关键的技术,它涉及到人工智能和深度学习领域,特别是利用TensorFlow这一强大的机器学习框架。在这个项目中,我们关注的是一个基于TensorFlow的非安全成人内容(Not Safe For Work,...
总的来说,"ios-声音波形绘制.zip"的项目涵盖了iOS音频处理、图形绘制、动画和界面设计等多个方面,对于iOS开发者来说,这是一个很好的学习和实践资源。通过深入研究这个项目,你可以掌握如何在iOS应用中实现动态...
这个源码非常适合那些正在进行毕业设计或者想深入理解iOS应用程序开发,特别是涉及计算机视觉和人脸识别技术的学生进行学习。以下是关于这个项目的关键知识点: 1. **iOS应用开发基础**:这个项目是用Swift或...