使用iOS上的libpng从存储在NSData中的png数据中提取OpenGL原始RGB(A)纹理数据
不幸的是,似乎无法在iOS上使用内置方法从PNG文件中提取32位RGBA数据而不丢失alpha通道。因此,一直使用OpenGL来提取自己的纹理。但是,所有示例都要求从文件加载png文件。假设这些纹理是通过网络连接导入的,则必须将它们保存到使用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的自定义功能解决了这个问题。在这里发布了一个要点: 希望这能帮助其他需要知道如何做到这一点的人。关键部分是创建一个方
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);
作为自定义读取方法