我正在iOS6中开发一个iPad应用程序,用于显示不同颜色和纹理的房屋设计。为此,我使用cocos2d。为了显示家中使用的纹理和颜色,我正在使用UIKit视图。 现在我想截取这个视图的截图,其中包含cocos2d图层和UIKit视图。 如果我使用cocos2d进行屏幕截图,如:
UIImage *screenshot = [AppDelegate screenshotWithStartNode:n];
然后它只是拍摄了cocos2d图层。
否则,如果我使用UIkit进行屏幕截图,如:
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
然后它只捕获了UIKit组件并停止了cocos2d部分。
我希望他们两个都在同一个屏幕截图中......
答案 0 :(得分: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
参考所有答案和评论非常有趣
我希望这可以帮到你
答案 1 :(得分:0)
我对此进行了很多研究......目前我找不到任何可以截取包含cocos2d和UIKit
的屏幕截图的代码。即使有一些代码可用,但在AppStore上是不可接受的。因此,如果您使用该代码,您的应用将被AppStore拒绝。
所以现在,我找到了一个临时解决方案来实现这个目标:
首先,我抓住了我的cocos2d图层的屏幕截图,然后在UIImageView
中截取了该屏幕截图,并在我的屏幕上将UIImageView
添加到所有现有UIViews
之后,就像这样无法想象这个事件:
[self.view insertSubview:imgView atIndex:1];
在索引1处,因为我的cocos2d层位于索引0.所以高于...
现在,cocos2d图片是我UIKit
视图的一部分,我用正常的UIKit
方式截取了当前屏幕的截图。我们有。我现在有截图包含两个视图。
这对我来说现在很有用。如果有人找到有效的解决方案,那么最受欢迎! 我会等待任何可行的解决方案。 谢谢大家的帮助!!!