Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios glReadPixels为iPhone 6返回不正确的图像,但在iPad和iPhone 5上正常工作_Ios_Iphone_Opengl Es_Glreadpixels_Eaglview - Fatal编程技术网

Ios glReadPixels为iPhone 6返回不正确的图像,但在iPad和iPhone 5上正常工作

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

我使用以下代码读取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 = 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];