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 截图

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