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