文档章节

iOS 绘图 剪裁 oc UIGraphics

大风23333
 大风23333
发布于 2017/02/06 10:19
字数 750
阅读 10
收藏 0
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
//    self.view.backgroundColor = [UIColor redColor];
    CGRect *rect;
    UIViewSon *son = [[UIViewSon alloc]init];
    [son drawRect:rect];
    
    UIImage  * tree = [UIImage imageNamed:@"hehe"];
    CGSize ts = [tree size];
    //使用uiimage进行绘图
//    UIGraphicsBeginImageContextWithOptions(CGSizeMake(ts.width * 2,ts.height), NO, 0);
//    [tree drawAtPoint:CGPointMake(0, 0)];
//    [tree drawAtPoint:CGPointMake(ts.width, 0)];
//    UIImage *im = UIGraphicsGetImageFromCurrentImageContext();
//    UIGraphicsEndImageContext();
//    
//   
//    UIImageView *imv = [[UIImageView alloc]initWithImage:im];
//    [self.view addSubview:imv];
//    imv.center = self.view.center;
//    
    
    
    
    
    
    
    //使用CGImage进行绘图
    
    /*
    //抽取图片的左右两边
    CGImageRef marLeft = CGImageCreateWithImageInRect([tree CGImage], CGRectMake(0, 0, ts.width / 2, ts.height));
    CGImageRef marRight = CGImageCreateWithImageInRect([tree CGImage], CGRectMake(ts.width / 2, 0, ts.width / 2, ts.height));
    //将图片绘制到画布上去
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(ts.width * 1.5, ts.height), NO, 0);
    
    CGContextRef con = UIGraphicsGetCurrentContext();
    
    CGContextDrawImage(con, CGRectMake(0, 0, ts.width / 2, ts.height), flip(marLeft));
    
    CGContextDrawImage(con, CGRectMake(ts.width / 2, 0, ts.width / 2, ts.height), flip(marRight));
    
    UIImage * im = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    //释放内存。arc在这里无效
    CGImageRelease(marRight);
    CGImageRelease(marLeft);
    UIImageView *imv = [[UIImageView alloc]initWithImage:im];
    [self.view addSubview:imv];
    imv.center = self.view.center;
    
    //绘出来的图是上下颠倒的,这不是你的问题,CGContextDrawImage来绘图就会出现这种问题,这主要是因为原始的本地坐标系与目标上下文不匹配
     1.解决方法是如此的奇葩。将CGImage 用CGContextDrawImage绘制到UIImage上,然后再获取对应的CGImage,然后再将CGImage绘制到画布上
    

    */
    
    /*你以为这样就完了????那你就太天真了,现在又出现了另一个问题:在双分辨率的设备上,如果我们的图片文件是高分辨率(@2x)版本,上面的绘图就是错误的。原因在于对于UIImage来说,在加载原始图片时使用的imageNamed:方法,它会自动根据所在设备的分辨率类型选择图片,并且UIImage通过设置用来适配的scale属性补偿图片的两倍尺寸。但是一个CGImage对象并没有scale属性,它不知道图片文件的尺寸是否为两倍!所以当调用UIImage的CGImage方法,你不能假定所获得的CGImage尺寸与原始UIImage是一样的。在单分辨率和双分辨率下,一个UIImage对象的size属性值都是一样的,但是双分辨率UIImage对应的CGImage是单分辨率UIImage对应的CGImage的两倍大。所以我们需要修改上面的代码,让其在单双分辨率下都可以工作。代码如下*/
    
    UIImage *mar = [UIImage imageNamed:@"hehe"];
    
    CGSize ms = [mar size];
    
    CGImageRef marCG = [mar CGImage];
    CGSize msCG = CGSizeMake(CGImageGetWidth(marCG), CGImageGetHeight(marCG));
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(ms.width, ms.height), NO, 0);
    CGImageRef imgLeft = CGImageCreateWithImageInRect(marCG, CGRectMake(0, 0, msCG.width / 2, msCG.height));
    CGImageRef imgRight = CGImageCreateWithImageInRect(marCG, CGRectMake(msCG.width / 2, 0, msCG.width / 2, msCG.height));
    
    [[UIImage imageWithCGImage:imgLeft scale:[mar scale] orientation:UIImageOrientationUp] drawAtPoint:CGPointMake(0, 0)];
    [[UIImage imageWithCGImage:imgRight scale:[mar scale] orientation:UIImageOrientationUp] drawAtPoint:CGPointMake(msCG.width / 2, 0)];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    //释放内存。arc在这里无效
    CGImageRelease(imgLeft);
    CGImageRelease(imgRight);
    UIImageView *imv = [[UIImageView alloc]initWithImage:img];
    [self.view addSubview:imv];
    imv.center = self.view.center;
    
}


//写一个方法获取图片画布,并将图片先反转绘制在画布上
CGImageRef flip(CGImageRef im)
{
    CGSize sz = CGSizeMake(CGImageGetWidth(im), CGImageGetHeight(im));
    UIGraphicsBeginImageContextWithOptions(sz, NO, 0);
    CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, sz.width, sz.height), im);
    CGImageRef result = [UIGraphicsGetImageFromCurrentImageContext() CGImage];
    return result;
}



/*     CIFilter与CIImage。   */




- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

这只是图片剪裁的一部分

 

 

更多UIView绘图参考http://www.cocoachina.com/industry/20140115/7703.html

 

© 著作权归作者所有

共有 人打赏支持
大风23333
粉丝 0
博文 14
码字总数 6627
作品 0
济南
程序员
私信 提问
基于 TouchVG 的矢量写字App

GlyphLite 基于 TouchVG 的矢量写字演示App (iOS/Android)。 本项目基于 GPL 2.0 开源协议,仅用于学习和交流,不可用于商业用途。欢迎进行任意改动和完善,使用了其中的代码的项目也必须使...

云贵高原
2014/07/29
0
0
一、Objective-C概述

说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略...

长平狐
2013/03/28
128
0
iOS与JS交互之UIWebView-JSExport协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「UIWebView与JS交互」「JSExport」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端(不...

QiShare
2018/08/31
0
0
iOS使用Objective-c自定义cordova插件(二)

接上一章. 中还有其它的配置、、、以及配置文件. eg: 框架: <framework src="CFNetwork.frame" weak="true"/> plist文件: <resource-file src="src/ios/PushConfig.plist"/> 默认的info.plis......

Michaelyn
2017/10/23
0
0
iOS的绘图机制-iOS,iPad,iPhone,Objective-c

嘿!我又回来了。 在前面我介绍了iOS的视图机制,我也提到了iOS的视图框框可以通过drawRect自己绘图,我也说过每个view的layer(CALayer)就像一个视图的投影,其实我们也可以来操作它定制一...

晨曦之光
2012/05/28
2.9K
0

没有更多内容

加载失败,请刷新页面

加载更多

Java单例模式学习记录

在项目开发中经常能遇见的设计模式就是单例模式了,而实现的方式最常见的有两种:饿汉和饱汉(懒汉)。由于日常接触较多而研究的不够深入,导致面试的时候被询问到后有点没底,这里记录一下学习...

JerryLin123
昨天
3
0
VSCODE 无法调试

VSCODE 无法调试 可以运行 可能的原因: GCC 的参数忘了加 -g

shzwork
昨天
4
0
理解去中心化 稳定币 DAI

随着摩根大通推出JPM Coin 稳定币,可以预见稳定币将成为区块链落地的一大助推器。 坦白来讲,对于一个程序员的我来讲(不懂一点专业经济和金融),理解DAI的机制,真的有一点复杂。耐心看完...

Tiny熊
昨天
4
0
5.线程实现

用于线程实现的Python模块 Python线程有时称为轻量级进程,因为线程比进程占用的内存少得多。 线程允许一次执行多个任务。 在Python中,以下两个模块在一个程序中实现线程 - _thread 模块 th...

Eappo_Geng
昨天
6
0
ServiceLoader

创建一个接口文件在resources资源目录下创建META-INF/services文件夹在services文件夹中创建文件,以接口全名命名创建接口实现类 内容me.zzp.ar.d.PostgreSQLDialectme.zzp.ar.d.Hype...

Cobbage
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部