libpng
Официальная эталонная библиотека для работы с изображениями в формате PNG (Portable Network Graphics). Она предоставляет полный набор функций для чтения, записи и обработки PNG-изображений, обеспечивая поддержку всех возможностей формата, включая альфа-канал, палитры, различные цветовые пространства и метаданные. Библиотека широко используется в графических приложениях, веб-браузерах и операционных системах благодаря своей надежности и строгому соответствию стандартам PNG.
Особенности
- полная поддержка спецификации PNG (Portable Network Graphics) и всех её расширений;
- возможность чтения и записи изображений с различными цветовыми типами (grayscale, RGB, palette, alpha channel);
- поддержка прогрессивной развертки (interlacing) для постепенной загрузки изображений;
- работа с метаданными (текстовые блоки, временные метки, цветовые профили ICC, sRGB);
- высокопроизводительные алгоритмы сжатия и распаковки с использованием zlib.
Основные компоненты
libpng предоставляет два основных интерфейса: простой (simple) для базовых операций и расширенный (advanced) для полного контроля над процессом чтения/записи (подробнее с документацией можно ознакомиться здесь).
Инициализация и управление структурой PNG
Библиотека использует структуры png_struct и png_info для управления состоянием чтения или записи PNG-файла. Эти структуры содержат всю необходимую информацию об изображении и параметрах обработки.
Основные функции инициализации:
png_create_read_struct()иpng_create_write_struct()— создание структур для чтения и записи;png_create_info_struct()— создание структуры информации об изображении;png_destroy_read_struct()иpng_destroy_write_struct()— освобождение ресурсов;png_init_io()— связывание структур PNG с файловым потоком (FILE*);png_set_read_fn()иpng_set_write_fn()— использование пользовательских функций ввода-вывода.
Чтение PNG-изображений
Библиотека предоставляет функции для чтения заголовка PNG, получения информации об изображении и декодирования пиксельных данных. Поддерживается как построчное чтение, так и чтение всего изображения сразу.
Функции чтения изображений:
png_read_info()— чтение заголовка и подготовка к декодированию данных;png_read_image()— чтение всего изображения в память (массив строк);png_read_rows()— чтение изображения построчно (для потоковой обработки);png_read_end()— завершение чтения после обработки всех данных;png_get_IHDR()— получение основных параметров изображения (ширина, высота, глубина цвета, тип цвета);png_get_valid()— проверка наличия дополнительных блоков (например, альфа-канала).
Запись PNG-изображений
libpng позволяет создавать PNG-файлы с полным контролем над параметрами изображения. Поддерживается настройка формата данных, сжатия и дополнительных блоков.
Функции записи изображений:
png_set_IHDR()— установка основных параметров изображения;png_write_info()— запись заголовка PNG;png_write_image()— запись всего изображения;png_write_rows()— запись изображения построчно;png_write_end()— завершение записи и добавление конечного маркера;png_set_compression_level()— установка уровня сжатия (0–9).
Преобразование форматов и цветовых пространств
Библиотека предоставляет широкие возможности для преобразования данных изображения во время чтения или записи. Это включает изменение глубины цвета, добавление или удаление альфа-канала, преобразование палитровых изображений в RGB и другие преобразования.
Функции преобразования:
png_set_expand()— расширение палитровых изображений до RGB и grayscale до 8 бит;png_set_gray_to_rgb()— преобразование grayscale в RGB;png_set_rgb_to_gray()— преобразование RGB в grayscale;png_set_strip_alpha()— удаление альфа-канала;png_set_add_alpha()— добавление альфа-канала;png_set_packing()иpng_set_packswap()— упаковка и изменение порядка бит для изображений с глубиной менее 8 бит;png_set_swap()иpng_set_bgr()— изменение порядка байт и каналов.
Работа с метаданными и дополнительными блоками
PNG поддерживает различные типы дополнительных блоков (chunks), которые могут содержать метаданные. libpng предоставляет API для чтения и записи этих блоков, включая текстовую информацию, цветовые профили и временные метки.
Функции работы с метаданными:
png_get_text()иpng_set_text()— чтение и запись текстовых блоков (tEXt, zTXt, iTXt);png_get_tIME()иpng_set_tIME()— работа с временными метками;png_get_iCCP()иpng_set_iCCP()— чтение и запись ICC-профилей;png_get_sRGB()иpng_set_sRGB()— работа с информацией о цветовом пространстве sRGB;png_get_pHYs()иpng_set_pHYs()— получение и установка физических размеров пикселя (разрешение);png_get_hIST()иpng_set_hIST()— работа с гистограммой для палитровых изображений.
Обработка ошибок и диагностика
libpng включает развитую систему обработки ошибок, которая позволяет приложениям корректно реагировать на проблемы при чтении или записи PNG-файлов. Библиотека также предоставляет средства для отладки и получения диагностической информации.
Функции обработки ошибок и диагностики:
- Установка пользовательских функций обработки ошибок через
png_set_error_fn(); png_get_error_ptr()— получение указателя на пользовательские данные для обработки ошибок;png_set_benign_errors()— игнорирование некритичных ошибок (например, неизвестных блоков);png_get_copyright(),png_get_header_version(),png_get_libpng_ver()— получение информации о версии библиотеки.
Интеграция с другими библиотеками
libpng часто используется в сочетании с другими библиотеками обработки изображений, такими как libjpeg, libtiff, и графическими интерфейсами, такими как GTK, Qt, SDL.
Точки интеграции:
- Использование в графических редакторах (GIMP, Photoshop) и просмотрщиках изображений;
- Интеграция с веб-браузерами для отображения PNG-изображений;
- Поддержка в языках программирования через обертки (Python через Pillow, Java через ImageIO, Perl, Ruby и др.);
- Использование в игровых движках для загрузки текстур.