# libpng

Официальная эталонная библиотека для работы с изображениями в формате PNG (Portable Network Graphics). Она предоставляет полный набор функций для чтения, записи и обработки PNG-изображений, обеспечивая поддержку всех возможностей формата, включая альфа-канал, палитры, различные цветовые пространства и метаданные. Библиотека широко используется в графических приложениях, веб-браузерах и операционных системах благодаря своей надежности и строгому соответствию стандартам PNG.

## Особенности

- полная поддержка спецификации PNG (Portable Network Graphics) и всех её расширений;
- возможность чтения и записи изображений с различными цветовыми типами (grayscale, RGB, palette, alpha channel);
- поддержка прогрессивной развертки (interlacing) для постепенной загрузки изображений;
- работа с метаданными (текстовые блоки, временные метки, цветовые профили ICC, sRGB);
- высокопроизводительные алгоритмы сжатия и распаковки с использованием zlib.

## Основные компоненты

libpng предоставляет два основных интерфейса: простой (simple) для базовых операций и расширенный (advanced) для полного контроля над процессом чтения/записи (подробнее с документацией можно ознакомиться [здесь](http://www.libpng.org/pub/png/libpng-manual.txt)).

### Инициализация и управление структурой 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 и др.);
- Использование в игровых движках для загрузки текстур.
