Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用iOS上的libpng从存储在NSData中的png数据中提取OpenGL原始RGB(A)纹理数据_Ios_Objective C_Opengl Es_Libpng_Premultiplied Alpha - Fatal编程技术网

使用iOS上的libpng从存储在NSData中的png数据中提取OpenGL原始RGB(A)纹理数据

使用iOS上的libpng从存储在NSData中的png数据中提取OpenGL原始RGB(A)纹理数据,ios,objective-c,opengl-es,libpng,premultiplied-alpha,Ios,Objective C,Opengl Es,Libpng,Premultiplied Alpha,不幸的是,似乎无法在iOS上使用内置方法从PNG文件中提取32位RGBA数据而不丢失alpha通道。因此,一直使用OpenGL来提取自己的纹理。但是,所有示例都要求从文件加载png文件。假设这些纹理是通过网络连接导入的,则必须将它们保存到NSData中的文件中,然后读取。将原始PNG数据提取到原始OpenGL RGBA纹理数据中的最佳方法是什么?最后编写了一个类别,使用libpng的自定义功能解决了这个问题。在这里发布了一个要点: 希望这能帮助其他需要知道如何做到这一点的人。关键部分是创建一个方

不幸的是,似乎无法在iOS上使用内置方法从PNG文件中提取32位RGBA数据而不丢失alpha通道。因此,一直使用OpenGL来提取自己的纹理。但是,所有示例都要求从文件加载png文件。假设这些纹理是通过网络连接导入的,则必须将它们保存到
NSData
中的文件中,然后读取。将原始PNG数据提取到原始OpenGL RGBA纹理数据中的最佳方法是什么?

最后编写了一个类别,使用libpng的自定义功能解决了这个问题。在这里发布了一个要点:

希望这能帮助其他需要知道如何做到这一点的人。关键部分是创建一个方法

void user_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
{
    void *nsDataPtr = png_get_io_ptr(png_ptr);
    ReadStream *readStream = (ReadStream*)nsDataPtr;
    memcpy(data, readStream->source + readStream->index, length);
    readStream->index += length;
}
和使用

// init png reading
png_set_read_fn(png_ptr, &readStream, user_read_data);
作为自定义读取方法