2012-02-06 2 views
3

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

Что мне нужно сейчас, это кнопка, которая снимает скриншот содержимого 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); 
} 

ответ

2

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

CGFloat scale = UIScreen.mainScreen.scale; 
CGRect s = CGRectMake(0, 0, 320 * scale, 480 * scale);    
2

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

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

CGFloat scale = [[UIScreen mainScreen] scale]; 
CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale); 
+0

Спасибо за вашу помощь - я действительно ценю это :) И то, что вы оба говорите мне, также имеет смысл. Хотя я получаю «неиспользуемую переменную» из части «CGRect s = CGRectMake», и она по-прежнему не захватывает больше, чем левый нижний угол экрана? – Thomas

+0

@Thomas вы заменяете свой код нашим кодом? В коде, опубликованном в вашем вопросе, вы определили 'CGRect', который вы использовали для создания своего буфера, и в вашем вызове' glReadPixels'. Если вы заменили эту строку кода на две строки выше, вы не получите предупреждение о неиспользуемой переменной, и вы захватите весь экран. –

0

мысли я бы куранты и, в то же время , проливают благодарность :)

Я получил это работает как шарм сейчас, вот очистили код:

UIImage *outputImage = nil; 

CGFloat scale = [[UIScreen mainScreen] scale]; 
CGRect s = CGRectMake(0, 0, 320.0f * scale, 480.0f * scale);    
uint8_t *buffer = (uint8_t *) malloc(s.size.width * s.size.height * 4); 

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); 

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

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

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

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); 

outputImage = [UIImage imageWithCGImage: outputRef]; 

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

UIImageWriteToSavedPhotosAlbum(outputImage, nil, nil, nil); 

 Смежные вопросы

  • Нет связанных вопросов^_^