Я работаю над дополнением к реальности для клиента. Часть 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);
}
Спасибо за вашу помощь - я действительно ценю это :) И то, что вы оба говорите мне, также имеет смысл. Хотя я получаю «неиспользуемую переменную» из части «CGRect s = CGRectMake», и она по-прежнему не захватывает больше, чем левый нижний угол экрана? – Thomas
@Thomas вы заменяете свой код нашим кодом? В коде, опубликованном в вашем вопросе, вы определили 'CGRect', который вы использовали для создания своего буфера, и в вашем вызове' glReadPixels'. Если вы заменили эту строку кода на две строки выше, вы не получите предупреждение о неиспользуемой переменной, и вы захватите весь экран. –