Извлечение необработанных данных текстуры OpenGL RGB(A) из данных png, хранящихся в NSData, с помощью libpng на iOS

К сожалению, кажется, что нет способа использовать встроенный метод в iOS для извлечения 32-битных данных RGBA из файла PNG без потери ссылки на альфа-канал. Поэтому некоторые люди используют libpng для извлечения текстур OpenGL. Однако во всех примерах файл png должен быть загружен из файла. Предполагая, что эти текстуры импортированы по сетевому соединению, они должны быть сохранены в файлы из NSData а потом читать. Каков наилучший способ извлечения необработанных данных PNG в необработанные данные текстуры OpenGL RGBA?

1 ответ

Решение

Закончилось написание категории, которая решает эту проблему, используя возможности настройки 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);

как пользовательский метод чтения.

Другие вопросы по тегам