# libjpeg

Широко используемая библиотека для работы с изображениями в формате JPEG (Joint Photographic Experts Group). Она предоставляет функции для чтения, записи, сжатия и декомпрессии изображений в формате JPEG, а также для выполнения различных операций преобразования изображений. Библиотека известна своей надежностью, производительностью и совместимостью с множеством приложений.

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

- поддержка чтения и записи файлов в формате JPEG (базовый, прогрессивный, с потерями и без потерь);
- настраиваемые параметры сжатия (качество, субдискретизация, прогрессивный режим);
- возможность работы с различными цветовыми пространствами (YCbCr, RGB, grayscale);
- высокая производительность благодаря оптимизированным алгоритмам.

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

libjpeg предоставляет набор функций и структур данных для работы с JPEG-изображениями на низком и высоком уровнях (подробнее с документацией можно ознакомиться [здесь](http://libjpeg.sourceforge.net/)).

### Управление сжатием и декомпрессией

Библиотека использует объекты-представления для управления процессом сжатия (compression) и декомпрессии (decompression). Эти объекты хранят состояние и параметры, необходимые для обработки JPEG-данных.

Основные объекты и функции:

- `jpeg_compress_struct` и `jpeg_decompress_struct` — основные структуры для сжатия и декомпрессии;
- `jpeg_create_compress()` и `jpeg_create_decompress()` — инициализация структур;
- `jpeg_destroy_compress()` и `jpeg_destroy_decompress()` — освобождение ресурсов;
- `jpeg_stdio_dest()` и `jpeg_stdio_src()` — указание источника/приемника данных (файл);
- `jpeg_mem_dest()` и `jpeg_mem_src()` — работа с памятью как источником/приемником.

### Чтение и запись JPEG-файлов

Библиотека предоставляет функции для чтения заголовков JPEG, декомпрессии данных изображения, а также для настройки параметров сжатия и записи изображений в формате JPEG.

Функции чтения и записи:

- `jpeg_read_header()` — чтение заголовка JPEG-файла (без декомпрессии данных);
- `jpeg_start_decompress()` — начало процесса декомпрессии;
- `jpeg_read_scanlines()` — чтение данных изображения построчно;
- `jpeg_start_compress()` — начало процесса сжатия;
- `jpeg_write_scanlines()` — запись данных изображения построчно;
- `jpeg_finish_decompress()` и `jpeg_finish_compress()` — завершение процессов.

### Управление параметрами сжатия

libjpeg позволяет тонко настраивать параметры сжатия для достижения баланса между качеством изображения и размером файла. Это включает настройку качества, субдискретизации цветовых компонент и других параметров.

Основные параметры сжатия:

- `jpeg_set_quality()` — установка уровня качества (от 0 до 100);
- `jpeg_set_colorspace()` — выбор цветового пространства (JCS_RGB, JCS_GRAYSCALE, JCS_YCbCr);
- Управление субдискретизацией (через `jpeg_set_defaults()` и `jpeg_default_colorspace`);
- Выбор типа сжатия (базовый, прогрессивный) через `jpeg_simple_progression()` и `jpeg_suppress_tables()`.

### Обработка ошибок и восстановление

Библиотека включает механизмы обработки ошибок, которые позволяют приложениям корректно реагировать на проблемы при чтении или записи JPEG-файлов. Также поддерживается ограниченное восстановление после ошибок.

Функции обработки ошибок:

- Установка пользовательского обработчика ошибок через `jpeg_error_mgr`;
- `jpeg_abort()` — аварийное прерывание обработки;
- `jpeg_resync_to_restart()` — попытка восстановления после ошибки в потоке данных;
- Режим "warning" для некритичных проблем.

### Преобразование изображений

libjpeg предоставляет встроенные возможности для преобразования изображений во время декомпрессии, такие как изменение размера, обрезка и преобразование цветового пространства.

Функции преобразования:

- `jpeg_crop_scanline()` — обрезка изображения по горизонтали;
- `jpeg_skip_scanlines()` — пропуск строк (для быстрого масштабирования);
- Масштабирование во время декомпрессии через `jpeg_scale_num` и `jpeg_scale_denom`;
- Автоматическое преобразование цветового пространства (например, YCbCr в RGB).

### Интеграция с другими библиотеками

libjpeg часто используется в сочетании с другими библиотеками обработки изображений, такими как libpng, libtiff, и графическими интерфейсами, такими как GTK, Qt.

Точки интеграции:

- Использование в графических редакторах (GIMP, Photoshop) и просмотрщиках изображений;
- Интеграция с веб-серверами для динамической обработки изображений;
- Использование в мобильных приложениях для загрузки и сохранения изображений;
- Поддержка в языках программирования через обертки (Python, Java, Perl и др.).
