Распакуйте PNG с помощью zlib - PullRequest
3 голосов
/ 29 марта 2010

Как я могу использовать библиотеку zlib для распаковки файла PNG? Мне нужно прочитать файл PNG, используя C под компилятором gcc.

Ответы [ 4 ]

4 голосов
/ 29 марта 2010

Почему бы не использовать libpng ? Формат файла PNG довольно прост, но существует множество возможных вариантов и методов кодирования, и может быть довольно утомительно, чтобы охватить все случаи. Что-то вроде libpng автоматически обрабатывает все преобразования и прочее.

2 голосов
/ 30 марта 2010

Однажды я написал базовую библиотеку Java для чтения / записи файлов PNG: http://code.google.com/p/pngj/

Он не поддерживает изображения на поддонах, но кроме этого [Обновлено: теперь поддерживаются все варианты PNG], он довольно полный, простой и код не имеет внешних зависимостей (то есть использует только стандартный JSE API , который включает в себя декомпрессию почтового индекса). И код доступен. Я думаю, вы могли бы перенести его на C без особых усилий.

2 голосов
/ 29 марта 2010

Если это домашнее задание, и вы действительно ограничены только стандартной библиотекой C, вы должны ознакомиться с официальной спецификацией формата файла PNG: http://www.w3.org/TR/PNG/. Однако вы уверены, что вам действительно нужно декодировать файл PNG? Если все, что вам нужно сделать, это как-то отобразить это, вы идете по неверному пути.

Написание декодера для любого общего файла PNG будет довольно сложным и длительным, но не слишком плохим для простых. Фактически, поскольку формат PNG позволяет сжимать его фрагменты, для его выполнения только со стандартными библиотеками C потребуется реализация gzip декомпрессии (разумное домашнее задание для студентов среднего уровня, но я полагаю, что вы потратил бы много времени на обсуждение алгоритмов сжатия до того, как это было назначено вам)

Однако, это не очень сложно, если вы ограничиваете себя несжатые, чересстрочные файлы PNG. Однажды я написал в Python декодер, который обрабатывал только простые случаи за пару часов, поэтому я уверен, что это будет выполнимо в C.

0 голосов
/ 29 марта 2010

Вы, вероятно, должны прочитать о том, как работает двоичный формат файла, и использовать шестнадцатеричный редактор вместо текстового редактора для просмотра файлов. Как правило, вы должны использовать libpng для обработки png-файлов, как указано ранее, но если вы хотите декодировать его самостоятельно, у вас есть много возможностей для чтения.

Я рекомендую прочитать это http://www.libpng.org/pub/png/book/chapter13.html

...