1

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

4

1 回答 1

0

最终编写了一个使用 libpng 的自定义功能解决此问题的类别。在此处发布要点:https ://gist.github.com/joshcodes/5681512

希望这可以帮助其他需要知道如何完成的人。最重要的部分是创建一个方法

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);

作为自定义读取方法。

于 2013-05-30T23:53:33.697 回答