libjpeg-turbo: Описание и использование в операционной системе НАЙС ОС
В операционной системе НАЙС ОС, которая широко используется в России для различных задач, важным компонентом является пакет libjpeg-turbo. Этот пакет является высокопроизводительной библиотекой для работы с форматом изображений JPEG. В отличие от стандартной библиотеки libjpeg, libjpeg-turbo использует SIMD-инструкции (Single Instruction Multiple Data) для ускорения кодирования и декодирования изображений.
libjpeg-turbo поддерживает большинство функций, доступных в стандартной библиотеке libjpeg, и предоставляет те же интерфейсы API и ABI, что делает его полностью совместимым с программами, которые используют libjpeg. Это делает замену стандартной библиотеки libjpeg на libjpeg-turbo в НАЙС ОС не только возможной, но и выгодной.
Особенности и преимущества libjpeg-turbo в НАЙС ОС
- Высокая производительность: Благодаря использованию SIMD-инструкций (MMX, SSE2, AVX2 на архитектуре x86, NEON на архитектуре ARM), libjpeg-turbo позволяет добиться значительного повышения скорости обработки изображений JPEG по сравнению со стандартной библиотекой libjpeg.
- Совместимость: Полная совместимость с API и ABI libjpeg делает переход на libjpeg-turbo простым и беспроблемным для приложений, разработанных с использованием libjpeg.
- Поддержка различных архитектур: libjpeg-turbo поддерживает самые распространенные архитектуры, такие как x86, x86-64, ARM и PowerPC, что делает его универсальным решением для широкой гаммы устройств и приложений.
- Простота установки: В НАЙС ОС, которая использует RPM-пакеты и пакетные менеджеры tdnf или dnf, установка libjpeg-turbo осуществляется легко и быстро.
Установка libjpeg-turbo в НАЙС ОС
Установка libjpeg-turbo в НАЙС ОС может быть выполнена с помощью утилит пакетного менеджера tdnf или dnf следующим образом:
Использование tdnf
sudo tdnf install libjpeg-turbo
Использование dnf
sudo dnf install libjpeg-turbo
После установки библиотека станет доступна для использования в приложениях, требующих работы с изображениями в формате JPEG.
Примеры использования libjpeg-turbo
Пример 1: Чтение и запись JPEG изображений
Ниже приведен пример простого приложения, которое использует libjpeg-turbo для чтения и записи изображений в формате JPEG с использованием языка программирования C.
Код на C
#include#include #include int main() { // Открытие входного JPEG файла FILE *infile = fopen("input.jpg", "rb"); if (!infile) { fprintf(stderr, "Невозможно открыть входной файл: input.jpg\n"); return 1; } // Создание структуры для работы с JPEG struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); jpeg_stdio_src(&cinfo, infile); // Чтение параметров изображения jpeg_read_header(&cinfo, TRUE); jpeg_start_decompress(&cinfo); // Создание буфера для изображения int row_stride = cinfo.output_width * cinfo.output_components; JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray) ((j_common_ptr)&cinfo, JPOOL_IMAGE, row_stride, 1); // Чтение изображения и вывод на экран while (cinfo.output_scanline < cinfo.output_height) { jpeg_read_scanlines(&cinfo, buffer, 1); // обрабатываем строку изображения, например, выводим ее на экран } // Завершение декомпрессии и освобождение ресурсов jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(infile); // Открытие выходного JPEG файла FILE *outfile = fopen("output.jpg", "wb"); if (!outfile) { fprintf(stderr, "Невозможно открыть выходной файл: output.jpg\n"); return 1; } // Создание структуры для сжатия изображения struct jpeg_compress_struct cinfo_compress; cinfo_compress.err = jpeg_std_error(&jerr); jpeg_create_compress(&cinfo_compress); jpeg_stdio_dest(&cinfo_compress, outfile); // Установка параметров сжатия cinfo_compress.image_width = cinfo.output_width; cinfo_compress.image_height = cinfo.output_height; cinfo_compress.input_components = cinfo.output_components; cinfo_compress.in_color_space = cinfo.out_color_space; jpeg_set_defaults(&cinfo_compress); jpeg_set_quality(&cinfo_compress, 75, TRUE); // Сжатие и запись изображения jpeg_start_compress(&cinfo_compress, TRUE); while (cinfo_compress.next_scanline < cinfo_compress.image_height) { jpeg_write_scanlines(&cinfo_compress, buffer, 1); } // Завершение компрессии и освобождение ресурсов jpeg_finish_compress(&cinfo_compress); jpeg_destroy_compress(&cinfo_compress); fclose(outfile); return 0; }
Пример 2: Работа с библиотекой TurboJPEG
В этом примере показано, как использовать низкоуровневый API TurboJPEG для сжатия и декомпрессии изображений JPEG:
Код на C
#include#include #include int main() { // Открытие входного файла FILE *infile = fopen("input.bmp", "rb"); if (!infile) { fprintf(stderr, "Невозможно открыть входной файл: input.bmp\n"); return 1; } // Загрузка изображения BMP fseek(infile, 0, SEEK_END); long size = ftell(infile); fseek(infile, 0, SEEK_SET); unsigned char *bmpBuf = (unsigned char *)malloc(size); fread(bmpBuf, size, 1, infile); fclose(infile); // Создание структуры TurboJPEG для сжатия tjhandle tjCompress = tjInitCompress(); if (!tjCompress) { fprintf(stderr, "Ошибка инициализации TurboJPEG: %s\n", tjGetErrorStr()); return 1; } int width = 800; // Ширина изображения BMP int height = 600; // Высота изображения BMP int pitch = 0; // Автоматическое выравнивание int pixelFormat = TJPF_BGR; // Формат пикселя BGR int quality = 75; // Качество JPEG // Буфер для сжатия JPEG unsigned long jpegSize = 0; unsigned char *jpegBuf = NULL; // Сжатие изображения int rc = tjCompress2(tjCompress, bmpBuf, width, pitch, height, pixelFormat, &jpegBuf, &jpegSize, TJSAMP_444, quality, TJFLAG_FASTDCT); if (rc) { fprintf(stderr, "Ошибка сжатия изображения: %s\n", tjGetErrorStr()); tjDestroy(tjCompress); return 1; } // Запись сжатого изображения в файл FILE *outfile = fopen("output.jpg", "wb"); if (outfile) { fwrite(jpegBuf, jpegSize, 1, outfile); fclose(outfile); } else { fprintf(stderr, "Невозможно открыть выходной файл: output.jpg\n"); } // Освобождение ресурсов tjFree(jpegBuf); tjDestroy(tjCompress); free(bmpBuf); fprintf(stdout, "Изображение успешно сжато и сохранено как output.jpg\n"); return 0; }
Заключение
Использование libjpeg-turbo в Российской операционной системе НАЙС ОС предоставляет значительное преимущество за счет высокой производительности и полной совместимости с существующими приложениями, использующими libjpeg. Примеры, представленные выше, демонстрируют основные возможности библиотеки и показывают, как легко интегрировать ее в программные продукты.
Будь то обработка графических изображений, создание фотогалерей, или разработка приложений для мультимедиа, libjpeg-turbo в НАЙС ОС – это надежный выбор для быстрого и эффективного управления изображениями в формате JPEG.