Ios glReadPixels为iPhone 6返回不正确的图像,但在iPad和iPhone 5上正常工作
我使用以下代码读取OpenGL ES场景中的图像:Ios glReadPixels为iPhone 6返回不正确的图像,但在iPad和iPhone 5上正常工作,ios,iphone,opengl-es,glreadpixels,eaglview,Ios,Iphone,Opengl Es,Glreadpixels,Eaglview,我使用以下代码读取OpenGL ES场景中的图像: - (UIImage *)drawableToCGImage { CGRect myRect = self.bounds; NSInteger myDataLength = myRect.size.width * myRect.size.height * 4; glFinish(); glPixelStorei(GL_PACK_ALIGNMENT, 4); int width = myRect.size.width; int height
- (UIImage *)drawableToCGImage
{
CGRect myRect = self.bounds;
NSInteger myDataLength = myRect.size.width * myRect.size.height * 4;
glFinish();
glPixelStorei(GL_PACK_ALIGNMENT, 4);
int width = myRect.size.width;
int height = myRect.size.height;
GLubyte *buffer = (GLubyte *) malloc(myDataLength);
GLubyte *buffer2 = (GLubyte *) malloc(myDataLength);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer2);
for(int y1 = 0; y1 < height; y1++) {
for(int x1 = 0; x1 < width * 4; x1++) {
buffer[(height - 1 - y1) * width * 4 + x1] = buffer2[y1 * 4 * width + x1];
}
}
free(buffer2);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, myDataLength, NULL);
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * myRect.size.width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef imageRef = CGImageCreate(myRect.size.width, myRect.size.height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
UIImage *image = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return image;
}
有人能解释一下这个疯狂的魔法吗?多亏@MaticOblak,我已经解决了这个问题 缓冲区填充不正确,因为rect size的浮点值未正确舍入(是的,仅适用于iPhone 6维度)。相反,应使用整数值 UPD:我的问题已通过以下代码修复:
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
int width = viewport[2];
int height = viewport[3];
您是否使用
UIImageWriteToSavedPhotosAlbum()
预览图像?我发现,当保存从位图上下文生成的图像而不首先转换为png或jpeg格式时,会产生奇怪的效果。在输出图像之前,请尝试使用UIImagePNGRepresentation()
。此外,您可能还应该为位图信息指定KCGIMAGEAlphaPremultipledLast
。@originaluser2我正在使用调试器预览图像(快速查看功能)。我刚刚尝试将其保存为PNG,但结果是一样的。KCGIMAGEAlphaPremultipledLast也没有这样做。显示结果可能有助于找到发生的情况。@MaticOblak我无法上传图像,但这里有一个链接-有趣的结果。查明问题可能会有所帮助。你有3个部分可能导致这种情况。首先是接收到的像素数据不正确,如果从读取像素获得的数据创建新纹理,然后检查帧快照以查看纹理是否正确,则最容易测试该数据。第二种是行交换,在生成图像时可以使用buffer2进行检查。如果这些都不是问题的原因,则图像生成必须是问题的原因。也许试试kCGBitmapByteOrder32Big | kCGImageAlphaLast至少这是我正在使用的…请添加固定行
GLint viewport[4];
glGetIntegerv(GL_VIEWPORT, viewport);
int width = viewport[2];
int height = viewport[3];