Ios 获取glviews图像错误?

Ios 获取glviews图像错误?,ios,opengl-es,cocos2d-iphone,Ios,Opengl Es,Cocos2d Iphone,这段代码适用于模拟器和任何不是视网膜屏幕的东西。但它给了我一个视网膜的黑色图像?我得到了非视网膜设备的正确图像。 有人知道为什么会出现黑屏吗 - (UIImage*) screenShotUIImage { CGSize size = glView.frame.size; //Create un buffer for pixels GLuint bufferLenght=size.width*size.height*4; GLubyte *buffer = (GLubyte *) malloc

这段代码适用于模拟器和任何不是视网膜屏幕的东西。但它给了我一个视网膜的黑色图像?我得到了非视网膜设备的正确图像。 有人知道为什么会出现黑屏吗

- (UIImage*) screenShotUIImage {

CGSize size = glView.frame.size;
//Create un buffer for pixels
GLuint bufferLenght=size.width*size.height*4;
GLubyte *buffer = (GLubyte *) malloc(bufferLenght);

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

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

uint32_t *pixels = (uint32_t *)malloc(bufferLenght);

CGContextRef context = CGBitmapContextCreate(pixels, glView.frame.size.width, glView.frame.size.height, 8, glView.frame.size.width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

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

/*
 CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(-90));
 CGContextTranslateCTM(context,-size.height, 0);
 */

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

//Dealloc
CGDataProviderRelease(provider);
CGImageRelease(iref);
CGContextRelease(context);
free(buffer);
free(pixels);
UIImageView *img=[[UIImageView alloc]initWithImage:outputImage];
[img setFrame:CGRectMake(0, 0, 800, 600)];
//    [self.view addSubview:img];
return outputImage; }

你试过什么?有几件事情可能会出错。您需要在调试器中单步执行,并查看它是哪一个。
缓冲区是否正确分配?如果是,调用
glReadPixels()
是否将有效数据放入缓冲区?如果是,是否实际分配了
iref
?那像素呢?
上下文是否实际创建?img怎么样?你没有检查这些东西。如果所有这些工作,你确定你的矩阵操作是正确的视网膜显示器?作为最低限度,你需要考虑屏幕的规模。在视网膜,比例为2.0。
UIView
contentScaleFactor
属性将为您提供刻度。在上面的代码中,
buffer
似乎正在使用逻辑宽度和高度。将每个值乘以刻度,得到正确的大小
缓冲区
,以及使用宽度和高度的其他位置。