glReadPixels сохраняет только снимки экрана размером 1/4 - PullRequest
3 голосов
/ 06 февраля 2012

Я работаю над приложением дополненной реальности для клиента.Часть OpenGL и EAGL была сделана в Unity 3D и реализована в виде в моем приложении.

Теперь мне нужна кнопка, которая делает снимок экрана с контентом OpenGL, который является самым задним видом.

Я пытался написать это сам, но когда я нажимаю кнопку с назначенным IBAction, он сохраняет только 1/4 экрана (нижний левый угол) - хотя и сохраняет его в кадре камеры.

Итак, как я могу сделать так, чтобы сохранить весь экран, а не одну четвертую?

вот мой код метода:

-(IBAction)tagBillede:(id)sender
{
    UIImage *outputImage = nil;

    CGRect s = CGRectMake(0, 0, 320, 480);            
    uint8_t *buffer = (uint8_t *) malloc(s.size.width * s.size.height * 4);

    if (!buffer) goto error;

    glReadPixels(0, 0, s.size.width, s.size.height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);    

    CGDataProviderRef ref = CGDataProviderCreateWithData(NULL, buffer, s.size.width * s.size.height * 4, NULL);

    if (!ref) goto error;

    CGImageRef iref = CGImageCreate(s.size.width, s.size.height, 8, 32, s.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGBitmapByteOrderDefault, ref, NULL, true, kCGRenderingIntentDefault);

    if (!iref) goto error;        

    size_t width = CGImageGetWidth(iref);    
    size_t height = CGImageGetHeight(iref);    
    size_t length = width * height * 4;            
    uint32_t *pixels = (uint32_t *)malloc(length);

    if (!pixels) goto error;

    CGContextRef context = CGBitmapContextCreate(pixels, width, height, 8, width * 4,    
        CGImageGetColorSpace(iref), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Big);

    if (!context) goto error;            

    CGAffineTransform transform = CGAffineTransformIdentity;    
    transform = CGAffineTransformMakeTranslation(0.0f, height);    
    transform = CGAffineTransformScale(transform, 1.0, -1.0);    
    CGContextConcatCTM(context, transform);            
    CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, width, height), iref);         
    CGImageRef outputRef = CGBitmapContextCreateImage(context);

    if (!outputRef) goto error;

    outputImage = [UIImage imageWithCGImage: outputRef]; 

    if (!outputImage) goto error;    

    CGDataProviderRelease(ref);   
    CGImageRelease(iref);    
    CGContextRelease(context);    
    CGImageRelease(outputRef);
    free(pixels);
    free(buffer);

    UIImageWriteToSavedPhotosAlbum(outputImage, self, @selector(image: didFinishSavingWithError: contextInfo:), nil);
}

Ответы [ 3 ]

2 голосов
/ 06 февраля 2012

Если устройство представляет собой сетчатку, вам нужно самостоятельно масштабировать OpenGL. Вы на самом деле указываете, что вам нужен нижний левый угол, захватывая только половину ширины и половину высоты.

Вам необходимо удвоить ширину и высоту экрана сетчатки, но на самом деле вы должны умножить его на масштаб экрана:

CGFloat scale = [[UIScreen mainScreen] scale];
CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale);
2 голосов
/ 06 февраля 2012

Я подозреваю, что вы используете устройство с дисплеем Retina, размером 640x960.Вы должны принять во внимание масштаб экрана;это 1,0 на дисплеях без Retina и 2,0 на дисплеях Retina.Попробуйте инициализировать s следующим образом:

CGFloat scale = UIScreen.mainScreen.scale;
CGRect s = CGRectMake(0, 0, 320 * scale, 480 * scale);            
0 голосов
/ 09 февраля 2012

Подумал, что я перезвоню и, в то же время, скажу благодарность

...