美文网首页算法
iOS截屏screenshot(屏幕截屏及scrollView或

iOS截屏screenshot(屏幕截屏及scrollView或

作者: 羽裳有涯 | 来源:发表于2023-03-12 15:00 被阅读0次

    1、1. 截取屏幕尺寸大小的图片并保存至相册

    保存至相册只需将方法saveImage中的代码替换即可

    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, YES, 0.0);
    
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    

    2 2. scrollView或tableView的全部截屏并保存至相册

    - (void)saveImage {
    
        UIImage* viewImage = nil;
    
        UITableView *scrollView = self.tableView;
    
        UIGraphicsBeginImageContextWithOptions(scrollView.contentSize, scrollView.opaque, 0.0);
    
        {
    
            CGPoint savedContentOffset = scrollView.contentOffset;
    
            CGRect savedFrame = scrollView.frame;
    
            
    
            scrollView.contentOffset = CGPointZero;
    
            scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);
    
            
    
            [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];
    
            viewImage = UIGraphicsGetImageFromCurrentImageContext();
    
            
    
            scrollView.contentOffset = savedContentOffset;
    
            scrollView.frame = savedFrame;
    
        }
    
        UIGraphicsEndImageContext();
    
        
    
        [self saveImageToPhotos:viewImage];
    
    }
    
    
    - (void)saveImageToPhotos:(UIImage*)savedImage {
    
        UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
    
    }
    
     
    
    - (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo {
    
        NSString *msg = nil ;
    
        if(error != NULL){
    
            msg = @"保存图片失败" ;
    
        }else{
    
            msg = @"保存图片成功" ;
    
        }
    
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"保存图片结果提示"
    
                                                        message:msg
    
                                                       delegate:self
    
                                              cancelButtonTitle:@"确定"
    
                                              otherButtonTitles:nil];
    
        [alert show];
    
    }
    

    screenshot

    + (UIImage *)screenshot
    {
        CGSize imageSize = CGSizeZero;
    
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
        if (UIInterfaceOrientationIsPortrait(orientation)) {
            imageSize = [UIScreen mainScreen].bounds.size;
        } else {
            imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
        }
    
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
        CGContextRef context = UIGraphicsGetCurrentContext();
        for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
            CGContextSaveGState(context);
            CGContextTranslateCTM(context, window.center.x, window.center.y);
            CGContextConcatCTM(context, window.transform);
            CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y);
            if (orientation == UIInterfaceOrientationLandscapeLeft) {
                CGContextRotateCTM(context, M_PI_2);
                CGContextTranslateCTM(context, 0, -imageSize.width);
            } else if (orientation == UIInterfaceOrientationLandscapeRight) {
                CGContextRotateCTM(context, -M_PI_2);
                CGContextTranslateCTM(context, -imageSize.height, 0);
            } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
                CGContextRotateCTM(context, M_PI);
                CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);
            }
            if ([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)]) {
                [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:YES];
            } else {
                [window.layer renderInContext:context];
            }
            CGContextRestoreGState(context);
        }
    
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image;
    }
    
    

    swift screenshot

    class func screenshot() -> UIImage {
        var imageSize = CGSizeZero
    
        let orientation = UIApplication.sharedApplication().statusBarOrientation
        if UIInterfaceOrientationIsPortrait(orientation) {
            imageSize = UIScreen.mainScreen().bounds.size
        } else {
            imageSize = CGSize(width: UIScreen.mainScreen().bounds.size.height, height: UIScreen.mainScreen().bounds.size.width)
        }
    
        UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
        let context = UIGraphicsGetCurrentContext()
        for window in UIApplication.sharedApplication().windows {
            CGContextSaveGState(context)
            CGContextTranslateCTM(context, window.center.x, window.center.y)
            CGContextConcatCTM(context, window.transform)
            CGContextTranslateCTM(context, -window.bounds.size.width * window.layer.anchorPoint.x, -window.bounds.size.height * window.layer.anchorPoint.y)
            if orientation == .LandscapeLeft {
                CGContextRotateCTM(context, CGFloat(M_PI_2))
                CGContextTranslateCTM(context, 0, -imageSize.width)
            } else if orientation == .LandscapeRight {
                CGContextRotateCTM(context, -CGFloat(M_PI_2))
                CGContextTranslateCTM(context, -imageSize.height, 0)
            } else if orientation == .PortraitUpsideDown {
                CGContextRotateCTM(context, CGFloat(M_PI))
                CGContextTranslateCTM(context, -imageSize.width, -imageSize.height)
            }
            if window.respondsToSelector("drawViewHierarchyInRect:afterScreenUpdates:") {
                window.drawViewHierarchyInRect(window.bounds, afterScreenUpdates: true)
            } else if let context = context {
                window.layer.renderInContext(context)
            }
            CGContextRestoreGState(context)
        }
    
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
    

    iOS应用内截图代码

    有待改写工具类?????

    第一种方法(截全屏幕)

    下面这段代码可以将当前屏幕显示的内容截图放置相册中,需要导入

    -(void)viewDidAppear:(BOOL)animated
    
     
    
    {
    
     
    
    [superviewDidAppear:animated];
    
     
    
    self.view.backgroundColor= [UIColorgreenColor];
    
     
    
    UIWindow*screenWindow = [[UIApplicationsharedApplication]keyWindow];
    
     
    
    UIGraphicsBeginImageContext(screenWindow.frame.size);
    
     
    
    [screenWindow.layerrenderInContext:UIGraphicsGetCurrentContext()];
    
     
    
    UIImage* viewImage =UIGraphicsGetImageFromCurrentImageContext();
    
     
    
    UIGraphicsEndImageContext();
    
     
    
    UIImageWriteToSavedPhotosAlbum(viewImage,nil,nil,nil);
    
     
    
    }
    
    

    第二种方法(自定义截图区域)

    pragmamark -=====自定义截屏位置大小的逻辑代码=====-

    staticintScreenshotIndex=0; //

    -(void)ScreenShot{
    
     
    
    //这里因为我需要全屏接图所以直接改了,宏定义iPadWithd为1024,iPadHeight为768,
    
     
    
    //UIGraphicsBeginImageContextWithOptions(CGSizeMake(640, 960), YES, 0);//设置截屏大小
    
     
    
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(iPadWidth, iPadHeight), YES,0);//设置截屏大小
    
     
    
    [[self.view layer] renderInContext:UIGraphicsGetCurrentContext()];
    
     
    
    UIImage *viewImage =UIGraphicsGetImageFromCurrentImageContext();
    
     
    
    UIGraphicsEndImageContext();
    
     
    
    CGImageRef imageRef =viewImage.CGImage;
    
     
    
    //CGRect rect = CGRectMake(166, 211, 426, 320);//这里可以设置想要截图的区域
    
     
    
    CGRect rect = CGRectMake(0,0, iPadWidth, iPadHeight);//这里可以设置想要截图的区域
    
     
    
    CGImageRef imageRefRect =CGImageCreateWithImageInRect(imageRef, rect);
    
     
    
    UIImage *sendImage =[[UIImage alloc] initWithCGImage:imageRefRect];
    
     
    
    UIImageWriteToSavedPhotosAlbum(sendImage, nil, nil, nil);//保存图片到照片库
    
     
    
    NSData *imageViewData =UIImagePNGRepresentation(sendImage);
    
     
    
    NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
     
    
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
     
    
    NSString *pictureName= [NSString stringWithFormat:@"screenShow_%d.png",ScreenshotIndex];
    
     
    
    NSString *savedImagePath =[documentsDirectory stringByAppendingPathComponent:pictureName];
    
     
    
    NSLog(@"截屏路径打印: %@", savedImagePath);
    
     
    
    //这里我将路径设置为一个全局String,这里做的不好,我自己是为了用而已,希望大家别这么写
    
     
    
    [self SetPickPath:savedImagePath];
    
     
    
    [imageViewData writeToFile:savedImagePath atomically:YES];//保存照片到沙盒目录
    
     
    
    CGImageRelease(imageRefRect);
    
     
    
    ScreenshotIndex++;
    
     
    
    }
    

    //设置路径

    - (void)SetPickPath:(NSString *)PickImage {
    
     
    
    _ScreenshotsPickPath =PickImage;
    
     
    
    }
    
    
    

    //获取路径<这里我就直接用于邮件推送的代码中去了,能达到效果,但肯定有更好的写法>

    - (NSString *)GetPickPath {
    return_ScreenshotsPickPath;
    
    }
    

    IOS获取设备屏幕代码(截屏)

    -(void) screenShot{
    
        
    
      UIGraphicsBeginImageContext(self.bounds.size);   //self为需要截屏的UI控件 即通过改变此参数可以截取特定的UI控件 
    
      [self.layer renderInContext:UIGraphicsGetCurrentContext()];    
    
      UIImage *image= UIGraphicsGetImageFromCurrentImageContext();
    
      UIGraphicsEndImageContext();    
    
      NSLog(@"image:%@",image); //至此已拿到image
    
     
    
      UIImageView *imaView = [[UIImageView alloc] initWithImage:image];   
    
      imaView.frame = CGRectMake(0, 700, 500, 500);    
    
      [self addSubview:imaView];    
    
        
    
      UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);//把图片保存在本地
    
    }
    
    
    

    相关文章

      网友评论

        本文标题:iOS截屏screenshot(屏幕截屏及scrollView或

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