我正在研究分配给我的项目的一些现有代码。

我成功调用了glTexImage2D,如下所示:glTexImage2D(GL_TEXTURE_2D, 0, texture->format, texture->widthTexture, texture->heightTexture, 0, texture->format, texture->type, texture->data);
我想使用传递给CGImage的变量来创建图像(最好是UIImageglTexImage2D),但不知道是否可能。

我需要从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/

10-13 04:37