使用 CCRenderTexture 在 CoCos2d V2.xx 中保存屏幕截图

Posted

技术标签:

【中文标题】使用 CCRenderTexture 在 CoCos2d V2.xx 中保存屏幕截图【英文标题】:Saving a screenshot in CoCos2d V2.xx using CCRenderTexture 【发布时间】:2012-03-24 17:14:36 【问题描述】:

我知道有很多关于如何使用 CCRenderTexture 在 CoCos2d 中保存屏幕的示例,但它们似乎对我不起作用。我为客户编写了一个着色书应用程序,他们当然希望能够保存图像。我尝试了很多不同的方法,并且对一堆例子进行了混蛋无济于事。最近,我一直收到这个错误:

2012-03-24 13:07:03.749 图画书[823:1be03] cocos2d:错误: 保存文件失败:/Users/macbookpro/Library/Application 支持/iPhone 模拟器/5.1/Applications/76F88977-AD3A-47B8-8026-C9324BB3636E/Documents/Users/macbookpro/Library/Application Support/iPhone 模拟器/5.1/Applications/76F88977-AD3A-47B8-8026-C9324BB3636E/Documents/testimagename.png 到磁盘

从设备运行时我得到类似的东西。这是我的截图代码:

- (void) takeScreenShot
  
     NSString* file = @"testimagename.png";

NSArray* paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* screenshotPath = [documentsDirectory 
                            stringByAppendingPathComponent:file];

[CCDirector sharedDirector].nextDeltaTimeZero = YES;

CGSize winSize = [CCDirector sharedDirector].winSize;
CCRenderTexture* rtx = 
[CCRenderTexture renderTextureWithWidth:winSize.width 
                                 height:winSize.height];
[rtx begin];
[Page visit];
[rtx end];

// save as file as PNG
[rtx  saveToFile:screenshotPath
         format:kCCImageFormatPNG];
 

这可能很简单,但这几天让我发疯了!拜托,Stack Overflow,让我感到愚蠢并解决我的问题!

【问题讨论】:

进入 saveToFile 方法。如果它返回一个 NSError 对象,请查看它是否为您提供了更多信息(即权限被拒绝、磁盘空间不足等)。如果这无济于事,请尝试将任何文件保存到同一路径,例如使用 NSString writeToFile 并提供一个 NSError 对象,该对象可能会为您提供更多信息。 @LearnCocos2D - 首先,感谢您的回复!好的,我通过了,它没有给出任何错误。它通过 saveToFile 部分的if( format == kCCImageFormatPNG ) imageData = UIImagePNGRepresentation( image ); 段。它只是为成功变量返回 FALSE,因此它必须在提交期间失败。我将尝试快速保存其他内容。 @LearnCocos2D 好的,我刚刚使用 writeToFile 将文件保存到 Documents 文件夹中,所以不应该是路径。 【参考方案1】:

我遇到的问题归结为定义路径。您不需要定义设备的 Documents 部分的路径,Cocos2D 默认将其保存到 Documents 中。我把这些放在一起(非常感谢 LearnCocos2D 提供我正在使用的一些代码)来保存我想要的图层,然后将屏幕保存到照片库中。

- (void) takeScreenShot


//name the file we want to save in documents
NSString* file = @"//imageforphotolib.png";

//get the path to the Documents directory
NSArray* paths = NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* screenshotPath = [documentsDirectory 
                            stringByAppendingPathComponent:file];

[CCDirector sharedDirector].nextDeltaTimeZero = YES;

//creating standard screensize variable
CGSize winSize = [CCDirector sharedDirector].winSize;

//we're using transparancies as the images, 
//so we load this white page to give a backdrop
CCSprite *whitePage = [CCSprite spriteWithFile:@"whitePage.png"];
whitePage.position = ccp(winSize.width/2, winSize.height/2);

//create a render texture to hold our images
CCRenderTexture* rtx = 
[CCRenderTexture renderTextureWithWidth:winSize.width 
                                 height:winSize.height];
[rtx begin];// open the texture
[whitePage visit];//add a white page to the background
[Page visit];//put in the background image
[target visit];//put in the coloring layer
[rtx end];//close the texture

// save as file as PNG
[rtx  saveToFile:@"imageforphotolib.png"
         format:kCCImageFormatPNG];

//get the screenshot as raw data
NSData *data = [NSData dataWithContentsOfFile:screenshotPath];
//create an image from the raw data
UIImage *img = [UIImage imageWithData:data];
//save the image to the users Photo Library
UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);
 

【讨论】:

以上是关于使用 CCRenderTexture 在 CoCos2d V2.xx 中保存屏幕截图的主要内容,如果未能解决你的问题,请参考以下文章

Cocos2dx CCRendertexture 和 framebuffer 对象问题。我的新纹理看起来不一样。 Alpha 值不正确

COCO 数据集的使用

coco图像识别无法使用

coco数据集图片尺寸不一

使用 coco 数据格式 json 文件进行交叉验证

COCO 使用说明书