iOS 截图

作者: goyohol | 来源:发表于2017-11-27 16:56 被阅读23次

最近公司项目完了!闲的每天都只有写下简书!把以前总结的东西都归纳出来!😂😂😂



包括:截屏、截取视图 以及 截取指定视图范围!!


方法如下:

/** 截屏 */
-(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];














goyohol's essay

相关文章

  • iOS 截图的那些事儿

    iOS 截图的那些事儿 iOS 截图的那些事儿

  • iTunes Connect对App截图的要求 iOS 上架 A

    iTunes Connect对App截图的要求 iOS发布时的截图尺寸 IOS 模拟器截图设置 xcode6 模拟...

  • iOS-WKWebView UIScrollView 全屏截图,

    iOS-WKWebView UIScrollView 全屏截图,网页全屏截图UiTableView UIScrol...

  • iOS应用内截图代码

    iOS应用内截图代码

  • iOS 截图

    1、屏幕截图 2、scrollView、tableView的截图 类似于上面的截图,会有一定的问题,如果你用sel...

  • iOS 截图

    最近公司项目完了!闲的每天都只有写下简书!把以前总结的东西都归纳出来!??? 包括:截屏、截取某个视图 以及 截取...

  • iOS 截图

    本人最近要对图片进行截图,在截图过程中遇到了一系列的问题,并把我的学习成果分享出来。 上面是一张我要进行截图的原图...

  • ios 截图

    今日学习截图的另一种方法,质量更好,更清晰 //方法1 UIGraphicsBeginImageContext(...

  • iOS 截图

  • iOS 截图

网友评论

    本文标题:iOS 截图

    本文链接:https://www.haomeiwen.com/subject/xnrdbxtx.html