zoukankan      html  css  js  c++  java
  • 截屏

    (UIImage *) captureScreen {

        UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
        CGRect rect = [keyWindow bounds];
        UIGraphicsBeginImageContext(rect.size);
        CGContextRef context = UIGraphicsGetCurrentContext();
        [keyWindow.layer renderInContext:context];  
        UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return img;
    }

    如果要保存到相册:

    1
    2
    3
    4
    - (void)saveScreenshotToPhotosAlbum:(UIView *)view
        {
            UIImageWriteToSavedPhotosAlbum([self captureScreen], nil, nil, nil);
        }
    开发游戏时,往往会有这么一个需求:在某个成就达成或者破纪录时,需要截个屏,然后发送到微博上与好友/粉丝分享,虽然home + 开机键组合可手动截屏,在Cocos2d有个CCRenderTexture类,借助该类可很容易实现代码截取功能。使用CCRenderTexture,我们可以截取游戏场景、某个Layer,甚至是精灵:
    
        /**游戏截图  
         *@param node 需要截取的控件  
        */  
        - (void)snapshotScreen:(CCNode*)node   
        {   
            //取得屏幕大小   
            CGSize winSize = [[CCDirector sharedDirector]winSize];   
            CCRenderTexture* renderTexture = [CCRenderTexture renderTextureWithWidth:winSize.width   
                                                                              height:winSize.height];   
            [renderTexture begin];   
            [node visit];   
            [renderTexture end];   
            [renderTexture cleanup];   
            UIImage *snapshot = [renderTexture getUIImageFromBuffer];   
            //把截图保存到相册里   
            UIImageWriteToSavedPhotosAlbum(snapshot, nil, nil, nil);   
        }  
    
      
    
    如果游戏支持高清模式,上面代码截出来的图是960 * 640大小的,这个尺寸如果要上传到微博上,文件的大小可能会超出限制,那么在上传前可用先把截图大小缩小点如480*320,以减少图片体积:
    
        /** 调整图片大小*/  
        - (UIImage *) scaleFromImage: (UIImage *) image toSize: (CGSize) size   
        {   
            UIGraphicsBeginImageContext(size);   
            [image drawInRect:CGRectMake(0, 0, size.width, size.height)];   
            UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();   
            UIGraphicsEndImageContext();   
            return newImage;   
        }  
    
      
    
    同时可以保存
    
    [cpp] view plaincopy
    
        保存文件  
          
        UIImage *m_imgFore=......;  
          
        //png格式  
          
        NSData *imagedata=UIImagePNGRepresentation(m_imgFore);  
          
        //JEPG格式  
          
        //NSData *imagedata=UIImageJEPGRepresentation(m_imgFore,1.0);  
          
        NSArray*paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);  
          
        NSString *documentsDirectory=[paths objectAtIndex:0];   
          
        NSString *savedImagePath=[documentsDirectorystringByAppendingPathComponent:@"saveFore.png"];  
          
        [imagedata writeToFile:savedImagePath atomically:YES];  
          
        或者  
          
        [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.png"] contents:data attributes:nil];    将图片保存为PNG格式  
          
         [fileManager createFileAtPath:[filePath stringByAppendingString:@"/image.jpg"] contents:data attributes:nil];   将图片保存为JPEG格式  
    
    
    
    如果不是cocos2D开发,则使用如下代码:
    
    方法1:
    [cpp] view plaincopy
    
        -(void)screenShots  
        {  
            CGSize imageSize = [[UIScreen mainScreen] bounds].size;  
            if (NULL != UIGraphicsBeginImageContextWithOptions) {  
                UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);  
            }  
            else  
            {  
                UIGraphicsBeginImageContext(imageSize);  
            }  
              
            CGContextRef context = UIGraphicsGetCurrentContext();  
              
            for (UIWindow * window in [[UIApplication sharedApplication] windows]) {  
                if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen]) {  
                    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);  
                    [[window layer] renderInContext:context];  
                      
                    CGContextRestoreGState(context);  
                }  
            }  
              
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
              
            UIGraphicsEndImageContext();  
            UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);  
            NSLog(@"Suceeded!");  
        }  
    
    
    (注意:方法1截图后会是竖屏,所以需要配合UIImage旋转的方法判断方向后旋转才能合适保存,见文章旋转翻转UIImage 不是UIImageView 适用于源图像的处理,例如截图后旋转)
    
    
    所以再提供另外一方法:
    
    方法2
    
    [cpp] view plaincopy
    
        UIView *view = [[[[[UIApplication sharedApplication] windows] objectAtIndex:1] subviews] lastObject];//获得某个window的某个subView  
           
            NSInteger index = 0;//用来给保存的png命名  
            for (UIView *subView in [view subviews]) {//遍历这个view的subViews  
                if ([subView isKindOfClass:NSClassFromString(@"UIImageView")] || [subView isKindOfClass:NSClassFromString(@"UIThreePartButton")]) {//找到自己需要的subView  
                    //支持retina高分的关键  
                    if(UIGraphicsBeginImageContextWithOptions != NULL)  
                    {  
                        UIGraphicsBeginImageContextWithOptions(subView.frame.size, NO, 0.0);  
                    } else {  
                        UIGraphicsBeginImageContext(subView.frame.size);  
                    }              
           
                    //获取图像  
                    [subView.layer renderInContext:UIGraphicsGetCurrentContext()];  
                    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();  
                    UIGraphicsEndImageContext();  
           
                    //保存图像  
                    NSString *path = [NSHomeDirectory() stringByAppendingFormat:@"/%d.png",index];  
                    if ([UIImagePNGRepresentation(image) writeToFile:path atomically:YES]) {  
                        index += 1;  
                        NSLog(@"Succeeded!");  
                    }  
                    else {  
                        NSLog(@"Failed!");  
                    }  
                }  
            }  
  • 相关阅读:
    【Rxjs】Rxjs预习
    【vscode】插件开发--vs控制在浏览器打开
    Unexpected directive 'XXX' imported by the module 'AppMoode'
    【vscode插件开发】vscode->angular组件跳转、数据监听流程
    pip 错误Requested **, but installing version **
    Temporary failure in name resolution
    python yield
    Python partial函数
    excel的导入导出
    Apache2.4 + Tomcat7 负载均衡配置
  • 原文地址:https://www.cnblogs.com/lidongq/p/4009913.html
Copyright © 2011-2022 走看看