在ios开发中,肯定会碰到需要截取部分图片的情况。
最终的效果类似这样:
先看最原始的示例,显示完整的图片写了个最简单的读取图片并显示的代码,打算以此为开始,逐渐实现截取部分图片的功能。
代码主要是,在控制器代码中:
- (void)loadView {
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
UIImage *image=[UIImage imageNamed:@"1.jpg"];
UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[contentView setImage:image];
self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:contentView];
}
另外,应该有一个名为1.jpg的768×1024的图片(我这里是iPad)。
截取整个图片可以认为截取整个图片是截取部分图片的一个特例。对ios不熟嘛,因此打算很谨慎的推进。截取整个图片可以减少中间的复杂性。
根据API,摸索着写了一个示例,效果出乎意料:
代码:
- (void)loadView {
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation: UIStatusBarAnimationSlide];
UIImage *image=[UIImage imageNamed:@"1.jpg"];
UIImageView *contentView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
//[contentView setImage:image];
CGRect rect = CGRectMake(0, 0, 768, 1024);//创建矩形框
UIGraphicsBeginImageContext(rect.size);//根据size大小创建一个基于位图的图形上下文
CGContextRef currentContext = UIGraphicsGetCurrentContext();//获取当前quartz 2d绘图环境
CGContextClipToRect( currentContext, rect);//设置当前绘图环境到矩形框
CGContextDrawImage(currentContext, rect, image.CGImage);//绘图
UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();//获得图片
UIGraphicsEndImageContext();//从当前堆栈中删除quartz 2d绘图环境
contentView.image=cropped;
self.view=[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
[self.view addSubview:contentView];
[cropped release];
}
这个代码说明了两点:
好的方面:说明我的代码起作用了,确实截取了所需的图形
坏的方面:图形是颠倒的,而且是镜像的。
问题应该出在坐标系上。下面画了一个quartz 2d的坐标系,坐标原点在左下角:
因此以这个坐标系取图形,就会有转向180°的效果。