iOS图像处理(4)坐标变化
在IOS中进行绘图都是根据点来确定位置,这里就有了坐标系的概念
在Core Graphics中坐标系的坐标原点在屏幕左下角,沿y轴正方向是向上的,而在UIKit中坐标原点在屏幕左上角,沿y轴正方向向下。
我们可以通过一个3行3列的变换矩阵对2维坐标系进行任意转换(或者通过更加简便的API),常用的转换包括移动(translate),缩放(scale)以及旋转(rotate)。
1 移动
- (void)drawRect:(CGRect)rect {//获取图像上下文对象CGContextRef context = UIGraphicsGetCurrentContext();CGContextTranslateCTM(context, 50, 30);UIImage *image = [UIImage imageNamed:@"mario.jpg"];[image drawInRect:rect]; }
2缩放
- (void)drawRect:(CGRect)rect {//获取图像上下文对象CGContextRef context = UIGraphicsGetCurrentContext();//X轴与Y轴均为之前的0.5倍CGContextScaleCTM(context, 0.5, 0.5);UIImage *image = [UIImage imageNamed:@"mario.jpg"];[image drawInRect:rect]; }
3旋转
- (void)drawRect:(CGRect)rect {//获取图像上下文对象CGContextRef context = UIGraphicsGetCurrentContext();//旋转30度(相对于原点(0,0))CGContextRotateCTM(context, 30 * M_PI / 180);UIImage *image = [UIImage imageNamed:@"mario.jpg"];[image drawInRect:rect]; }
如果频繁的进行坐标变化,往往会导致开发者分不清当前坐标的状态以及坐标原点的位置,此时可以使用
CGContextSaveGState(CGContextRef)以及CGContextRestoreGState(CGContextRef)两个函数存储当前绘图环境(包括坐标系统,绘图属性)以及恢复上次储存的绘图环境
坐标多次变化操作
- (void)drawRect:(CGRect)rect {//获取图像上下文对象CGContextRef context = UIGraphicsGetCurrentContext();UIImage *image = [UIImage imageNamed:@"girl.jpg"];CGContextSaveGState(context);CGContextScaleCTM(context, 0.5,0.5);[image drawInRect:rect];CGContextRestoreGState(context);CGContextSaveGState(context);CGContextTranslateCTM(context,rect.size.width/2, -rect.size.height/2);[image drawInRect:rect];CGContextRestoreGState(context); }
坐标按原点旋转,通过将原点平移到屏幕中心可以实现图片绕中心旋转
- (void)drawRect:(CGRect)rect {//获取图像上下文对象CGContextRef context = UIGraphicsGetCurrentContext();UIImage *image = [UIImage imageNamed:@"girl.jpg"];CGContextTranslateCTM(context,rect.size.width/2, rect.size.height/2);CGContextRotateCTM(context, -180 * M_PI / 180);[image drawInRect:CGRectMake(0 - rect.size.width/2, 0 - rect.size.height/2, rect.size.width, rect.size.height)]; }
除了使用上面三个坐标变换方法,还可以使用CGContextConcatCTM(CGContextRef,CGAffineTransform)进行坐标转换,该方法需要创建CGAffineTransform,它代表一个3*3的变换矩阵,可以实现2维坐标所有的变换。
关于CGAffineTransform的原理以及用法可以参考这篇博客
iOS图像处理(4)坐标变化相关推荐
- 详解OS X和iOS图像处理框架Core Image
详解OS X和iOS图像处理框架Core Image width="22" height="16" src="http://hits.sinaj ...
- iOS OpenGL 纹理坐标详解
//顶点着色器 //v.shader//顶点着色器是一个可编程的处理单元,执行顶点变换.纹理坐标变换.光照.材质等顶点的相关操作,每顶点执行一次.替代了传统渲染管线中顶点变换.光照以及纹理坐标的处理, ...
- 图像处理傅里叶变换图像变化_傅里叶变换和图像床单视图。
图像处理傅里叶变换图像变化 What do Fourier Transforms do? What do the Fourier modes represent? Why are Fourier Tr ...
- Web工程师和设计师必须要知道的 iOS 8的十个变化
本文原文为"iOS 8 and iPhone 6 for web developers and designers: next evolution for Safari and native ...
- EXCEL - 根据横纵列坐标变化寻找对应单元格的值
根据横纵列坐标变化寻找对应单元格的值 EXCEL,公式 同事想实现根据对应的纵横条件,寻找出对应单元格的值的公式. 一时也没想起更好的函数,用了个最笨的方法. 1.前面新增一列,混合USER+PLAC ...
- ios图像处理第2部分:核心图形,核心图像,GPUImage
原文地址:http://www.raywenderlich.com/71151/image-processing-ios-part-2-core-graphics-core-image-gpuimag ...
- OSG读取obj模型坐标变化的问题
首先需要强烈吐槽一下OSG这个设计,在加载obj模型的时候,会默认将模型绕x轴逆时针旋转90度,让我整整找了两天的原因....这个设计真的太智障了.... 我们来看一下,有一个正方体的obj模型,用记 ...
- 安卓复杂滑动案例 自定义behavior源码分析 实现头布局图片的缩放透明度变化,RecycleView的滑动布局,坐标变化
#复杂滑动案例 * 上方图片放大, * 透明 * 输入框,不断增大 * 变色 * 滑动的时候,条目不会改变. * 再滑的时候,条目滑动 # * 1,让rv居于头部的下方 * ...
- (iOS)判断GPS坐标是否在中国
由于火星坐标问题,所以需要判断一下经纬度是否在中国. 基本思路是:把整个行政区域划分为几个小的矩形,然后再排除掉一些矩形区域.只要一个点在限定的区域内,并且不在排除的区域内,则判定成功,否则失败.下图 ...
最新文章
- mysql悲观锁 更新_MySQL学习笔记(四)悲观锁 for update
- 深入理解ElasticSearch(七):执行分布式检索
- 前端学习(2375):项目介绍结束
- leetcode344. 反转字符串 史上最简单力扣题
- [转]Newtonsoft.Json高级用法
- ffmpeg-20160517-git-bin
- keil 4c语言 百度经验,Keil教程(4)
- Xcode12 兼容iOS14 及下载链接
- 网络面试100道(路由交换)
- 利用猜根法求解三阶行列式的特征值
- 互联网日报 | 字节跳动发布独立教育品牌“大力教育”;哈啰出行试水网约车;京东“好房京选”线下品牌落地...
- 经验分享:利用树莓派开发板制作无线路由器
- 随机生成汉字(随机点名册)
- php 正则 /is,PHP 正则表达式后面接的/isU, /is, /s含义
- 网络服务器怎么修改ip,怎么改变自己的IP地址?
- 收费变免费,是商业模式的颠覆式创新
- Linux中的buff/cache内存
- 如何实现U盘低格?这样操作快速搞定!
- 鼠标移上去悬停显示小手
- MFC项目有关打印功能(支持分页打印)
热门文章
- 有趣的兔子(斐波那契数列)
- Python中os.listdir的排序问题
- Communication error with Jack server
- 服务器虚拟多个终端,虚拟化终端新主流 支持多操作系统
- 利用智能算法优化参数的自适应变分模态分解,VMD实现混合储能系统的分频
- 网络设备配置与管理(华为)基础系列 20190307
- 华环光端机MySQL_华环155M光端机 H9MO-LME-01T1642/EJ
- 有哪些含金量较高的Python证书?
- Linux下默认字体是什么,linux默认字体是什么
- nodejs安装、解决下载速度慢、idea中用node引入vue