在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)坐标变化相关推荐

  1. 详解OS X和iOS图像处理框架Core Image

     详解OS X和iOS图像处理框架Core Image width="22" height="16" src="http://hits.sinaj ...

  2. iOS OpenGL 纹理坐标详解

    //顶点着色器 //v.shader//顶点着色器是一个可编程的处理单元,执行顶点变换.纹理坐标变换.光照.材质等顶点的相关操作,每顶点执行一次.替代了传统渲染管线中顶点变换.光照以及纹理坐标的处理, ...

  3. 图像处理傅里叶变换图像变化_傅里叶变换和图像床单视图。

    图像处理傅里叶变换图像变化 What do Fourier Transforms do? What do the Fourier modes represent? Why are Fourier Tr ...

  4. Web工程师和设计师必须要知道的 iOS 8的十个变化

    本文原文为"iOS 8 and iPhone 6 for web developers and designers: next evolution for Safari and native ...

  5. EXCEL - 根据横纵列坐标变化寻找对应单元格的值

    根据横纵列坐标变化寻找对应单元格的值 EXCEL,公式 同事想实现根据对应的纵横条件,寻找出对应单元格的值的公式. 一时也没想起更好的函数,用了个最笨的方法. 1.前面新增一列,混合USER+PLAC ...

  6. ios图像处理第2部分:核心图形,核心图像,GPUImage

    原文地址:http://www.raywenderlich.com/71151/image-processing-ios-part-2-core-graphics-core-image-gpuimag ...

  7. OSG读取obj模型坐标变化的问题

    首先需要强烈吐槽一下OSG这个设计,在加载obj模型的时候,会默认将模型绕x轴逆时针旋转90度,让我整整找了两天的原因....这个设计真的太智障了.... 我们来看一下,有一个正方体的obj模型,用记 ...

  8. 安卓复杂滑动案例 自定义behavior源码分析 实现头布局图片的缩放透明度变化,RecycleView的滑动布局,坐标变化

    #复杂滑动案例 * 上方图片放大, * 透明 * 输入框,不断增大     * 变色 * 滑动的时候,条目不会改变.     * 再滑的时候,条目滑动 #  * 1,让rv居于头部的下方     * ...

  9. (iOS)判断GPS坐标是否在中国

    由于火星坐标问题,所以需要判断一下经纬度是否在中国. 基本思路是:把整个行政区域划分为几个小的矩形,然后再排除掉一些矩形区域.只要一个点在限定的区域内,并且不在排除的区域内,则判定成功,否则失败.下图 ...

最新文章

  1. mysql悲观锁 更新_MySQL学习笔记(四)悲观锁 for update
  2. 深入理解ElasticSearch(七):执行分布式检索
  3. 前端学习(2375):项目介绍结束
  4. leetcode344. 反转字符串 史上最简单力扣题
  5. [转]Newtonsoft.Json高级用法
  6. ffmpeg-20160517-git-bin
  7. keil 4c语言 百度经验,Keil教程(4)
  8. Xcode12 兼容iOS14 及下载链接
  9. 网络面试100道(路由交换)
  10. 利用猜根法求解三阶行列式的特征值
  11. 互联网日报 | 字节跳动发布独立教育品牌“大力教育”;哈啰出行试水网约车;京东“好房京选”线下品牌落地...
  12. 经验分享:利用树莓派开发板制作无线路由器
  13. 随机生成汉字(随机点名册)
  14. php 正则 /is,PHP 正则表达式后面接的/isU, /is, /s含义
  15. 网络服务器怎么修改ip,怎么改变自己的IP地址?
  16. 收费变免费,是商业模式的颠覆式创新
  17. Linux中的buff/cache内存
  18. 如何实现U盘低格?这样操作快速搞定!
  19. 鼠标移上去悬停显示小手
  20. MFC项目有关打印功能(支持分页打印)

热门文章

  1. 有趣的兔子(斐波那契数列)
  2. Python中os.listdir的排序问题
  3. Communication error with Jack server
  4. 服务器虚拟多个终端,虚拟化终端新主流 支持多操作系统
  5. 利用智能算法优化参数的自适应变分模态分解,VMD实现混合储能系统的分频
  6. 网络设备配置与管理(华为)基础系列 20190307
  7. 华环光端机MySQL_华环155M光端机 H9MO-LME-01T1642/EJ
  8. 有哪些含金量较高的Python证书?
  9. Linux下默认字体是什么,linux默认字体是什么
  10. nodejs安装、解决下载速度慢、idea中用node引入vue