我正在研究分配给我的项目的一些现有代码。
我成功调用了glTexImage2D
,如下所示:glTexImage2D(GL_TEXTURE_2D, 0, texture->format, texture->widthTexture, texture->heightTexture, 0, texture->format, texture->type, texture->data);
我想使用传递给CGImage
的变量来创建图像(最好是UIImage
或glTexImage2D
),但不知道是否可能。
我需要从OpenGL视图创建许多连续的图像(每秒很多),并保存它们以备后用。
我应该能够使用CGImage
中使用的变量来创建UIImage
还是glTexImage2D
吗?
如果我应该能够,我应该怎么做?
如果不是,为什么我以及您对每秒多次保存/捕获opengl视图内容的任务有何建议?
编辑:我已经使用Apple提供的与glReadPixels
等类似的技术成功捕获了图像。我想要更快的速度,以便每秒获取更多图像。
编辑:在查看并添加了Thomson的代码后,以下是生成的图像:
该图像非常类似于图像的外观,除了在水平方向上重复〜5次并在其下面有一些随机的黑色空间。
注意:视频(每个帧)数据通过与iPhone的临时网络连接传输。我相信相机会在YCbCr色彩空间的每一帧上进行拍摄
编辑:进一步检查汤姆森的代码
我已将您的新代码复制到我的项目中,并得到了不同的图像:
宽度:320
高度:240
我不确定如何在Texture->数据中找到字节数。它是一个空指针。
编辑:格式和类型
texture.type = GL_UNSIGNED_SHORT_5_6_5
texture.format = GL_RGB
最佳答案
嗨,binnyb,这是使用UIImage
中存储的数据创建texture->data
的解决方案。 v01d当然是对的,您不会像在GL帧缓冲区中那样获得UIImage
,但会在数据通过帧缓冲区之前从图像中获取图像。
原来您的纹理数据是16位格式,红色5位,绿色6位,蓝色5位。我添加了用于在创建UIImage之前将16位RGB值转换为32位RGBA值的代码。我期待听到结果。
float width = 512;
float height = 512;
int channels = 4;
// create a buffer for our image after converting it from 565 rgb to 8888rgba
u_int8_t* rawData = (u_int8_t*)malloc(width*height*channels);
// unpack the 5,6,5 pixel data into 24 bit RGB
for (int i=0; i<width*height; ++i)
{
// append two adjacent bytes in texture->data into a 16 bit int
u_int16_t pixel16 = (texture->data[i*2] << 8) + texture->data[i*2+1];
// mask and shift each pixel into a single 8 bit unsigned, then normalize by 5/6 bit
// max to 8 bit integer max. Alpha set to 0.
rawData[channels*i] = ((pixel16 & 63488) >> 11) / 31.0 * 255;
rawData[channels*i+1] = ((pixel16 & 2016) << 5 >> 10) / 63.0 * 255;
rawData[channels*i+2] = ((pixel16 & 31) << 11 >> 11) / 31.0 * 255;
rawData[channels*4+3] = 0;
}
// same as before
int bitsPerComponent = 8;
int bitsPerPixel = channels*bitsPerComponent;
int bytesPerRow = channels*width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL,
rawData,
channels*width*height,
NULL);
free( rawData );
CGImageRef imageRef = CGImageCreate(width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorSpaceRef,
bitmapInfo,
provider,NULL,NO,renderingIntent);
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
感谢Rohit,用于创建新图像的代码来自Creating UIImage from raw RGBA data。我已经使用原始的320x240图像尺寸进行了测试,将24位RGB图像转换为5,6,5格式,然后转换为32位。我尚未在512x512的图片上对其进行测试,但是我预计不会出现任何问题。
关于objective-c - iOS OpenGL使用glTexImage2D的参数制作UIImage?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4652202/