zoukankan      html  css  js  c++  java
  • iOS

    推荐一个第三方好用的框架:SDScreenshotCapture 

    #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)  

    一、全屏截图

    UIImage *getImageWithFullScreenshot(void)  
    {  
        // Source (Under MIT License): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35  
          
        BOOL ignoreOrientation = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0");  
          
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;  
          
        CGSize imageSize = CGSizeZero;  
        if (UIInterfaceOrientationIsPortrait(orientation) || ignoreOrientation)  
            imageSize = [UIScreen mainScreen].bounds.size;  
        else  
            imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);  
          
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);  
        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);  
              
            // Correct for the screen orientation  
            if(!ignoreOrientation)  
            {  
                if(orientation == UIInterfaceOrientationLandscapeLeft)  
                {  
                    CGContextRotateCTM(context, (CGFloat)M_PI_2);  
                    CGContextTranslateCTM(context, 0, -imageSize.width);  
                }  
                else if(orientation == UIInterfaceOrientationLandscapeRight)  
                {  
                    CGContextRotateCTM(context, (CGFloat)-M_PI_2);  
                    CGContextTranslateCTM(context, -imageSize.height, 0);  
                }  
                else if(orientation == UIInterfaceOrientationPortraitUpsideDown)  
                {  
                    CGContextRotateCTM(context, (CGFloat)M_PI);  
                    CGContextTranslateCTM(context, -imageSize.width, -imageSize.height);  
                }  
            }  
              
            if([window respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])  
                [window drawViewHierarchyInRect:window.bounds afterScreenUpdates:NO];  
            else  
                [window.layer renderInContext:UIGraphicsGetCurrentContext()];  
              
            CGContextRestoreGState(context);  
        }  
          
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
          
        UIGraphicsEndImageContext();  
          
        return image;  
    }  

     

    二、修改部分区域截图

    以下代码是UIWindow的Category

    h文件

    #import <UIKit/UIKit.h>  
      
    @interface UIWindow (Category)  
      
    - (UIImage *)screenshot;  
    - (UIImage *)screenshotWithRect:(CGRect)rect;  
      
    @end  

    m文件

    #import "UIWindow+Category.h"  
      
    @implementation UIWindow (Category)  
      
    - (UIImage *)screenshot  
    {  
        return [self screenshotWithRect:self.bounds];  
    }  
      
    - (UIImage *)screenshotWithRect:(CGRect)rect  
    {  
        // Source (Under MIT License): https://github.com/shinydevelopment/SDScreenshotCapture/blob/master/SDScreenshotCapture/SDScreenshotCapture.m#L35  
          
        BOOL ignoreOrientation = SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0");  
          
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;  
          
        CGSize imageSize = CGSizeZero;  
        CGFloat width = rect.size.width, height = rect.size.height;  
        CGFloat x = rect.origin.x, y = rect.origin.y;  
          
    //    imageSize = CGSizeMake(width, height);  
    //    UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);  
        if (UIInterfaceOrientationIsPortrait(orientation) || ignoreOrientation)  
        {  
            //imageSize = [UIScreen mainScreen].bounds.size;  
            imageSize = CGSizeMake(width, height);  
            x = rect.origin.x, y = rect.origin.y;  
        }  
        else  
        {  
            //imageSize = CGSizeMake([UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);  
            imageSize = CGSizeMake(height, width);  
            x = rect.origin.y, y = rect.origin.x;  
        }  
          
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, [UIScreen mainScreen].scale);  
        CGContextRef context = UIGraphicsGetCurrentContext();  
        CGContextSaveGState(context);  
        CGContextTranslateCTM(context, self.center.x, self.center.y);  
        CGContextConcatCTM(context, self.transform);  
        CGContextTranslateCTM(context, -self.bounds.size.width * self.layer.anchorPoint.x, -self.bounds.size.height * self.layer.anchorPoint.y);  
          
        // Correct for the screen orientation  
        if(!ignoreOrientation)  
        {  
            if(orientation == UIInterfaceOrientationLandscapeLeft)  
            {  
                CGContextRotateCTM(context, (CGFloat)M_PI_2);  
                CGContextTranslateCTM(context, 0, -self.bounds.size.height);  
                CGContextTranslateCTM(context, -x, y);  
            }  
            else if(orientation == UIInterfaceOrientationLandscapeRight)  
            {  
                CGContextRotateCTM(context, (CGFloat)-M_PI_2);  
                CGContextTranslateCTM(context, -self.bounds.size.width, 0);  
                CGContextTranslateCTM(context, x, -y);  
            }  
            else if(orientation == UIInterfaceOrientationPortraitUpsideDown)  
            {  
                CGContextRotateCTM(context, (CGFloat)M_PI);  
                CGContextTranslateCTM(context, -self.bounds.size.height, -self.bounds.size.width);  
                CGContextTranslateCTM(context, x, y);  
            }  
            else  
            {  
                CGContextTranslateCTM(context, -x, -y);  
            }  
        }  
        else  
        {  
            CGContextTranslateCTM(context, -x, -y);  
        }  
          
        //[self layoutIfNeeded];  
          
        if([self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])  
            [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];  
        else  
            [self.layer renderInContext:UIGraphicsGetCurrentContext()];  
          
        CGContextRestoreGState(context);  
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
        UIGraphicsEndImageContext();  
          
        return image;  
    }  
      
    @end  

    注意:此代码在旋转后,裁剪区域是相对左上角为原点旋转的,一般使用不到旋转情况

    View截图

    h文件

    @interface UIView (Screenshot)  
    - (UIImage *)screenshot;  
    - (UIImage *)screenshotWithRect:(CGRect)rect;  
    @end  

    m文件

    @implementation UIView (Screenshot)  
      
    - (UIImage *)screenshot  
    {  
        return [self screenshotWithRect:self.bounds];  
    }  
      
    - (UIImage *)screenshotWithRect:(CGRect)rect;  
    {  
        UIGraphicsBeginImageContextWithOptions(rect.size, NO, [UIScreen mainScreen].scale);  
      
        CGContextRef context = UIGraphicsGetCurrentContext();  
        if (context == NULL)  
        {  
            return nil;  
        }  
        CGContextSaveGState(context);  
        CGContextTranslateCTM(context, -rect.origin.x, -rect.origin.y);  
          
        //[self layoutIfNeeded];  
      
        if( [self respondsToSelector:@selector(drawViewHierarchyInRect:afterScreenUpdates:)])  
        {  
            [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:NO];  
        }  
        else  
        {  
            [self.layer renderInContext:context];  
        }  
          
        CGContextRestoreGState(context);  
      
        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
        UIGraphicsEndImageContext();  
          
    //    NSData *imageData = UIImageJPEGRepresentation(image, 1); // convert to jpeg  
    //    image = [UIImage imageWithData:imageData scale:[UIScreen mainScreen].scale];  
          
        return image;  
    }  
  • 相关阅读:
    【android tools】内存、网络、界面性能响应优化的工具
    mysql命令(数据库备份与恢复)
    mysql中一些简单但是新手容易犯的错误
    Mysql bench执行sql语句批量操作数据所遇到的问题
    Excel “此单元格中的数字为文本格式,或者其前面有撇号” 设成数字格式
    VC程序异常中断的原因
    vs dump调试
    winsock.h与winsock2.h出现重定义或不同的链接
    QT中QString与string的转化,解决中文乱码问题
    线程中CreateEvent和SetEvent及WaitForSingleObject的用法
  • 原文地址:https://www.cnblogs.com/junhuawang/p/6963444.html
Copyright © 2011-2022 走看看