截屏

(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!");  

                }  

            }  

        }  

 

你可能感兴趣的:(截屏)