iOS 截图
2017-11-27 本文已影响23人
goyohol
最近公司项目完了!闲的每天都只有写下简书!把以前总结的东西都归纳出来!😂😂😂
/** 截屏 */
-(UIImage *)cutScreen {
return [self cutFromView:[UIApplication sharedApplication].keyWindow];
}
/** 从某视图 获取其图像 */
-(UIImage *)cutFromView:(UIView *)view
{
//开启 图形上下文
UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0f);
//获取 上下文
CGContextRef context = UIGraphicsGetCurrentContext();
if (!context) {
return nil;
}
//在新建的图形上下文中,渲染view的layer
[view.layer renderInContext:context];
//设定颜色:透明
[[UIColor clearColor] setFill];
//获取图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//关闭图形上下文
UIGraphicsEndImageContext();
return image;
}
/** 从某视图 获得指定范围内的图像 */
-(UIImage *)cutImageFromView:(UIView *)view andFrame:(CGRect)rect
{
//开启 图形上下文
UIGraphicsBeginImageContext(view.frame.size);
//获取 上下文
CGContextRef context = UIGraphicsGetCurrentContext();
if (!context) {
return nil;
}
CGContextSaveGState(context);
//获取 截图的范围
UIRectClip(rect);//图片裁剪
//在新建的图形上下文中,渲染view的layer
[view.layer renderInContext:context];
//设定颜色:透明
[[UIColor clearColor] setFill];
//获取图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//关闭图形上下文
UIGraphicsEndImageContext();
return image;
}
展示例子🌰
在ViewController里:
-
设置全局变量
@interface ViewController () { UIButton * _button; //“截图”按钮 UIImageView * _showImg_View; //展示图片 } @end
-
在“
- (void)viewDidLoad { }
”里,设置界面布局//“截图”按钮 _button = [[UIButton alloc] init]; [_button setBackgroundImage:[UIImage imageNamed:@"im"] forState:UIControlStateNormal]; _button.backgroundColor = [UIColor cyanColor]; _button.frame = CGRectMake(0, 0, 300.f, 300.f); _button.center = CGPointMake(self.view.center.x, (300.f+0.f)/2); [_button addTarget:self action:@selector(clickToShowScreenCut) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:_button]; //展示图片 _showImg_View = [[UIImageView alloc] init]; _showImg_View.image = [UIImage imageNamed:@"im"]; //设置背景色,方便观察! _showImg_View.backgroundColor = [UIColor greenColor]; _showImg_View.frame = CGRectMake(0, 0, 200.f, 200.f); _showImg_View.center = CGPointMake(self.view.center.x, _button.center.y+300.f); _showImg_View.layer.borderColor = [UIColor lightGrayColor].CGColor; _showImg_View.layer.borderWidth = 1.f; [self.view addSubview:_showImg_View];
效果:
按钮点击事件
在“-(void)clickToShowScreenCut { }
”里:
-
截屏
//截取 屏幕对应的图片 _showImg_View.image = [self cutScreen];
效果:截取的屏幕对应的图片,放在下方展示的图片视图里!!
-
截取视图(按钮:
_button
)//截取 按钮对应的图片 _showImg_View.image = [self cutFromView:_button];
效果:截取到按钮对应的图片
-
截取视图(按钮:
_button
)内部,某个(随机)范围内 对应的图片float random_X = arc4random()%100; float random_Y = arc4random()%100; NSLog(@"random_X:%lf random_Y:%lf",random_X,random_Y); _showImg_View.image = [self cutImageFromView:_button andFrame:CGRectMake(random_X, random_Y, _button.frame.size.width-random_X, _button.frame.size.height-random_Y)];
效果:截取到按钮在随机范围内对应的图片
问题:截取到图片的范围 为 所截取视图的整体范围!造成了“部分透明”的情况!!
解决:用“
CGImageCreateWithImageInRect
”获取某个范围内的cgImage!!得到正确(范围)的图片!!/** 从某视图 获得指定范围内的图像 */ -(UIImage *)cutImageFromView:(UIView *)view andFrame:(CGRect)rect { //开启 图形上下文 UIGraphicsBeginImageContext(view.frame.size); //获取 上下文 CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); //获取 截图的范围 UIRectClip(rect);//图片裁剪 //在新建的图形上下文中,渲染view的layer [view.layer renderInContext:context]; //设定颜色:透明 [[UIColor clearColor] setFill]; //获取图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //获取 某图片 指定范围(rect)内的cgImage CGImageRef cgImage = CGImageCreateWithImageInRect(image.CGImage, rect); UIImage * returnImage = [UIImage imageWithCGImage:cgImage]; CGImageRelease(cgImage); //关闭图形上下文 UIGraphicsEndImageContext(); return returnImage; }
效果:所获取图片的范围 正确!!
图片保存在本地:
NSData *data = UIImageJPEGRepresentation([self cutScreen], 1); //将对应的数据保存为图片文件 [data writeToFile:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/blabla.jpg"] atomically:YES];