2012-12-06 30 views
2

我正在开发iOS6中的iPad应用程序,该应用程序显示用不同颜色和纹理设计房屋。为此,我正在使用cocos2d。为了显示家中使用的纹理和颜色,我使用了UIKit视图。 现在我想截取包含cocos2d图层和UIKit视图的这个视图的截图。 如果我使用cocos2d的喜欢拍摄画面截图:如何捕捉包含cocs2d和UIKit的视图的屏幕截图

UIImage *screenshot = [AppDelegate screenshotWithStartNode:n]; 

则仅取的cocos2d层的一个单元。

否则,如果我使用的拍摄画面拍摄的UIKit喜欢:

UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 

则仅取的UIKit组件的捕获和停电的cocos2d的一部分。

我想他们都在同一个屏幕截图...

回答

0

我研究了很多关于这个......而且目前我找不到任何代码可以将包含cocos2d和UIKit的屏幕截屏在一起。即使有一些可用的代码,但它不适用于AppStore。所以,如果你使用该代码,你的应用程序将被从AppStore拒绝。

所以现在,我找到了一个临时解决方案,以实现这一目标:

首先,我把我的cocos2d层的截图,然后把那个截图的UIImageView并补充说UIImageView我的背后屏幕上的所有本UIViews这样,使得用户不能想像这个事件:

[self.view insertSubview:imgView atIndex:1]; 

在指数1,因为我的cocos2d层是如此高于指数0 ...现在

,即cocos2d图片是我的UIKit视图的一部分,我用正常的UIKit方式截取了当前屏幕的屏幕截图。我们在那里。我现在有包含两个视图的屏幕截图。

这对我来说现在工作。如果有人找到有效的解决方案,那么最欢迎! 我会等待任何可行的解决方案。 谢谢大家的帮助!

0

试试这个方法,只是改变一些代码,使您的要求..

-(UIImage*) screenshotUIImage 
{ 
    CGSize displaySize = [self displaySize]; 
    CGSize winSize  = [self winSize]; 

    //Create buffer for pixels 
    GLuint bufferLength = displaySize.width * displaySize.height * 4; 
    GLubyte* buffer = (GLubyte*)malloc(bufferLength); 

    //Read Pixels from OpenGL 
    glReadPixels(0, 0, displaySize.width, displaySize.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer); 
    //Make data provider with data. 
    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, bufferLength, NULL); 

    //Configure image 
    int bitsPerComponent = 8; 
    int bitsPerPixel = 32; 
    int bytesPerRow = 4 * displaySize.width; 
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); 
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; 
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault; 
    CGImageRef iref = CGImageCreate(displaySize.width, displaySize.height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent); 

    uint32_t* pixels = (uint32_t*)malloc(bufferLength); 
    CGContextRef context = CGBitmapContextCreate(pixels, winSize.width, winSize.height, 8, winSize.width * 4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 

    CGContextTranslateCTM(context, 0, displaySize.height); 
    CGContextScaleCTM(context, 1.0f, -1.0f); 

    switch (deviceOrientation_) 
    { 
     case CCDeviceOrientationPortrait: break; 
     case CCDeviceOrientationPortraitUpsideDown: 
      CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(180)); 
      CGContextTranslateCTM(context, -displaySize.width, -displaySize.height); 
      break; 
     case CCDeviceOrientationLandscapeLeft: 
      CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(-90)); 
      CGContextTranslateCTM(context, -displaySize.height, 0); 
      break; 
     case CCDeviceOrientationLandscapeRight: 
      CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(90)); 
      CGContextTranslateCTM(context, displaySize.width * 0.5f, -displaySize.height); 
      break; 
    } 

    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, displaySize.width, displaySize.height), iref); 
    CGImageRef imageRef = CGBitmapContextCreateImage(context); 
    UIImage *outputImage = [UIImage imageWithCGImage:imageRef]; 

    //Dealloc 
    CGImageRelease(imageRef); 
    CGDataProviderRelease(provider); 
    CGImageRelease(iref); 
    CGColorSpaceRelease(colorSpaceRef); 
    CGContextRelease(context); 
    free(buffer); 
    free(pixels); 

    return outputImage; 
} 

- (Texture2D*) screenshotTexture { 
    return [[Texture2D alloc] initWithImage:[self screenshotUIImage]]; 
} 

获取更多信息请参见This Link

参考所有回答和评论其非常有趣

我希望这可以帮到你

+0

没有亲爱的...它只需要cocos2d图层的屏幕截图... UIKit组件不在拍摄... –

+0

哦然后尝试给定的链接我发现任何东西然后将张贴 –

+0

@KananVora试试这个也哥们..见阙也可能你从这个想法得到一些想法.. http://stackoverflow.com/questions/962390/capturing-eaglview-content-with-alpha-channel-on-iphone –