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的原理以及用法可以参考这篇博客

时间: 2024-08-17 09:44:21

IOS图像处理(4)坐标变化的相关文章

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

转自:http://www.csdn.net/article/2015-02-13/2823961-core-image 摘要:本 文结合实例详解了OS X和iOS图像处理框架Core Image的使用,如何通过Core Image来创建和使用iOS的内置滤镜,非常适合初学者学习.虽然示例代码是用Swift写的iOS程序,不过实现概念很容易转换到 Objective-C和OS X. 这篇文章会为初学者介绍一下Core Image,一个OS X和iOS的图像处理框架. 如果你想跟着本文中的代码学习

ios根据gps坐标来计算两点间的距离

//ios根据gps坐标来计算两点间的距离 //x1,y1 点1的坐标 x2,y2点2的坐标 -(double) gps2m:(double)x1 _y1:(double)y1 _x2:(double)x2 _y2:(double)y2{ double radLat1 = (x1 * 3.1416 / 180.0); double radLat2 = (x2 * 3.1416 / 180.0); double a = radLat1 - radLat2; double b = (y1 - y2)

iOS 图像处理-剪裁图像

解决问题:按照某一长宽比例,剪裁图片的上部和下部,保留中间的内容.当然也可以自定义需要剪裁留下的区域 前提:需要添加Framework:CoreGraphics.framework 代码: - (UIImage*) crop:(UIImage*)theImage{ // Get size of current image CGSize size = [theImage size]; // Create rectangle that represents a cropped image CGFlo

iOS 图像处理 - 图像拼接

解决问题:将两个图像拼接在一起 前提:需要添加Framework:CoreGraphics.framework 源码: - (UIImage *) combine:(UIImage*)leftImage :(UIImage*)rightImage { CGFloat width = leftImage.size.width * 2; CGFloat height = leftImage.size.height; CGSize offScreenSize = CGSizeMake(width, h

iOS 图像处理 - 模糊图像

解决问题:将图像模糊 前提:添加 CoreGraphics.framework 源码: - (UIImage*) blur:(UIImage*)theImage { // create our blurred image CIContext *context = [CIContext contextWithOptions:nil]; CIImage *inputImage = [CIImage imageWithCGImage:theImage.CGImage]; // setting up G

iOS图像处理(一)UIImage创建图像

原文链接: iOS图像处理(一)UIImage创建图像 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/MajorLMJ iOS开发者公会-技术1群 QQ群号:87440292 iOS开发者公会-技术2群 QQ群号:232702419 iOS开发者公会-议事区   QQ群号:413102158

iOS图像处理(二)Core Image介绍

原文链接: iOS图像处理(二)Core Image介绍 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/MajorLMJ iOS开发者公会-技术1群 QQ群号:87440292 iOS开发者公会-技术2群 QQ群号:232702419 iOS开发者公会-议事区   QQ群号:413102158

IOS模拟器改坐标

iOS Simulator支持了随意更改定位坐标,方法很简单: iOS Simulator > Debug > Location > Custom Location...

iOS 屏幕原点坐标 && 导航栏风格的自定义

其一 屏幕原点坐标 (x ,y) 受 self.navigationController. navigationBar 的 setTranslucent (BOOL) 属性控制 在 iOS7 以后  translucent  属性默认为 YES   该属性含义是 毛玻璃 半透明效果 YES  起始 坐标 为屏幕顶端 左上角 为 (0 , 0)  ,此时 UI展示的内容可透过 导航栏 NO   起始 坐标 为屏幕顶端 左上角 为 (0 , 20 + 44) 这个说明 起始坐标 在状态栏 和 导航栏