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
似乎正在使用逻辑宽度和高度。将每个值乘以刻度,得到正确的大小缓冲区
,以及使用宽度和高度的其他位置。