2016-02-23 3 views
0

Я использую следующий код для чтения на изображение с 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]; 

Может кто-нибудь пролить свет на этой безумной магии, пожалуйста?

+0

Вы используете 'UIImageWriteToSavedPhotosAlbum()', чтобы просмотреть изображение? Я обнаружил, что может иметь странные эффекты при сохранении изображения, сгенерированного из контекста растрового изображения, без предварительного преобразования формата png или jpeg. Попробуйте использовать 'UIImagePNGRepresentation()' перед выводом вашего изображения. Также вы должны указать 'kCGImageAlphaPremultipliedLast' для информации битмапа. – Hamish

+0

@ originaluser2 Я использую отладчик для предварительного просмотра изображений (функция быстрого просмотра). Я просто пытался сохранить его как PNG, но результат тот же. kCGImageAlphaPremultipliedLast также ничего не делал. – Sashucity

+0

Показать результат может быть полезен при поиске того, что происходит. –

ответ

0

Благодаря @MaticOblak, я выяснил проблему.

Буфер заполнен неправильно, потому что значения плавающего прямоугольного размера не были правильно округлены (да, только для размера iPhone 6). Вместо этого следует использовать целые значения.

UPD: моя проблема была решена с помощью следующего кода:

GLint viewport[4]; 
glGetIntegerv(GL_VIEWPORT, viewport); 

int width = viewport[2]; 
int height = viewport[3]; 
+0

Please добавьте фиксированную линию (линии) –