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.

Информация о пакете
ОС: НАЙС ОС Z

URL: http://sourceforge.net/projects/libjpeg-turbo