gpt4 book ai didi

ios - glReadPixels 只保存 1/4 屏幕大小的快照

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:26 26 4
gpt4 key购买 nike

我正在为客户开发增强现实应用。 OpenGL 和 EAGL 部分已在 Unity 3D 中完成,并在我的应用程序中实现到 View 中。

我现在需要的是一个按钮,可以捕捉 OpenGL 内容的屏幕截图,这是最后面的 View 。

我尝试自己编写它,但是当我单击带有分配的 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);
}

最佳答案

我怀疑您使用的是配备 Retina 显示屏的设备,分辨率为 640x960。您需要考虑屏幕比例;在非 Retina 显示器上为 1.0,在 Retina 显示器上为 2.0。尝试像这样初始化 s:

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

关于ios - glReadPixels 只保存 1/4 屏幕大小的快照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com