菜鸟教程小白 发表于 2022-12-12 15:45:28

objective-c - iOS OpenGL 使用 glTexImage2D 的参数来制作 UIImage?


                                            <p><p>我正在处理分配给我的项目的一些现有代码。</p>

<p>我成功调用了 <code>glTexImage2D</code>,如下所示:<br/>
<code>glTexImage2D(GL_TEXTURE_2D, 0, texture->format, texture->widthTexture, texture->heightTexture, 0, texture->format, texture->type, texture->data);</code></p>

<p>我想使用传递给 <code>glTexImage2D</code> 的变量创建一个图像(最好是 <code>CGImage</code> 或 <code>UIImage</code>),但不知道是否有可能。</p>

<p>我需要从 OpenGLView 创建许多连续图像(每秒有很多)并将它们保存以供以后使用。</p>

<p>我应该能够使用我在 <code>glTexImage2D</code> 中使用的变量来创建 <code>CGImage</code> 或 <code>UIImage</code> 吗?</p>

<p>如果我应该可以,我应该怎么做?</p>

<p>如果不是,为什么我不能,你对我每秒多次保存/捕获我的 openglView 内容的任务有什么建议?</p>

<p>编辑:我已经使用苹果提供的一些技术以及 <code>glReadPixels</code> 等成功捕获了图像。我想要更快的东西,这样我每秒可以获得更多图像。</p>

<p>编辑:查看并添加来自 Thomson 的代码后,生成的图像如下:
<img src="/image/xJJTb.jpg" alt="resulting image from Thomson&#39;s code"/> </p>

<p>图像与图像的外观非常相似,但水平方向重复了约 5 次,并且下方有一些随机的黑色空间。 </p>

<p>注意:视频(每一帧)数据是通过与 iPhone 的临时网络连接来的。我相信相机正在使用 YCbCr 色彩空间拍摄每一帧</p>

<p>编辑:进一步审查 Thomson 的代码
我已将您的新代码复制到我的项目中,结果得到了不同的图像:</p>

<p> <img src="/image/8nCJi.jpg" alt="image 2"/> </p>

<p>宽度:320
高度:240</p>

<p>我不确定如何找到纹理-> 数据中的字节数。它是一个空指针。</p>

<p>编辑:格式和类型</p>

<p>texture.type = <code>GL_UNSIGNED_SHORT_5_6_5</code> </p>

<p>texture.format = <code>GL_RGB</code></p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>嘿,binnyb,这是使用存储在 <code>texture->data</code> 中的数据创建 <code>UIImage</code> 的解决方案。 v01d 肯定是正确的,您不会获得出现在 GL 帧缓冲区中的 <code>UIImage</code>,但它会在数据通过帧缓冲区之前从数据中为您获取图像。</code> p>

<p>原来你的纹理数据是 16 位格式,红色 5 位,绿色 6 位,蓝色 5 位。在创建 UIImage 之前,我添加了用于将 16 位 RGB 值转换为 32 位 RGBA 值的代码。我期待听到结果如何。</p>

<pre><code>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&lt;width*height; ++i)
{
    // append two adjacent bytes in texture-&gt;data into a 16 bit int
    u_int16_t pixel16 = (texture-&gt;data &lt;&lt; 8) + texture-&gt;data;      
    // 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   = ((pixel16 &amp; 63488)       &gt;&gt; 11) / 31.0 * 255;
    rawData = ((pixel16 &amp; 2016)&lt;&lt; 5&gt;&gt; 10) / 63.0 * 255;
    rawData = ((pixel16 &amp; 31)    &lt;&lt; 11 &gt;&gt; 11) / 31.0 * 255;
    rawData = 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 = ;
</code></pre>

<p>新建图片的代码来自<a href="https://stackoverflow.com/questions/4545237/creating-uiimage-from-raw-rgba-data" rel="noreferrer noopener nofollow">Creating UIImage from raw RGBA data</a>感谢罗希特。我已经用我们原始的 320x240 图像尺寸对此进行了测试,将 24 位 RGB 图像转换为 5、6、5 格式,然后再转换为 32 位。我尚未在 512x512 图像上对其进行测试,但我预计不会有任何问题。</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - iOS OpenGL 使用 glTexImage2D 的参数来制作 UIImage?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/4652202/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/4652202/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - iOS OpenGL 使用 glTexImage2D 的参数来制作 UIImage?