Я использую следующий код для чтения на изображение с OpenGL ES сцены:glReadPixels возвращает неправильный образ для iPhone 6, но работает нормально для IPad и iPhone 5
- (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;
}
Он отлично работает для IPad и старых версий iPhone , но я заметил, что на iPhone 6 (оба устройства и симуляторы) это выглядит как монохромные глюки. Что это может быть?
Кроме того, вот мой код свойства CAEAGLLayer:
eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
@YES, kEAGLDrawablePropertyRetainedBacking,
kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil];
Может кто-нибудь пролить свет на этой безумной магии, пожалуйста?
Вы используете 'UIImageWriteToSavedPhotosAlbum()', чтобы просмотреть изображение? Я обнаружил, что может иметь странные эффекты при сохранении изображения, сгенерированного из контекста растрового изображения, без предварительного преобразования формата png или jpeg. Попробуйте использовать 'UIImagePNGRepresentation()' перед выводом вашего изображения. Также вы должны указать 'kCGImageAlphaPremultipliedLast' для информации битмапа. – Hamish
@ originaluser2 Я использую отладчик для предварительного просмотра изображений (функция быстрого просмотра). Я просто пытался сохранить его как PNG, но результат тот же. kCGImageAlphaPremultipliedLast также ничего не делал. – Sashucity
Показать результат может быть полезен при поиске того, что происходит. –