libjpeg: распаковать & amp; культура

У меня есть следующий стандартный код для распаковки изображений JPEG, который основан на libjpeg,

jpeg_decompress_struct cinfo;
// ...Set error manager and data source...
jpeg_read_header(&cinfo, TRUE);
jpeg_start_decompress(&cinfo);
while (cinfo.output_scanline < cinfo.output_height) {
JSAMPLE* scanlines[1];
// ...Set target pointer for scanline...
jpeg_read_scanlines(&cinfo, scanlines, 1);
}
jpeg_destroy_decompress(&cinfo);

Я хочу прочитать часть изображения, обрезанную прямоугольником:

// struct RECT {
//     int left;
//     int top;
//     int right;
//     int bottom;
// };
RECT cropRect; // Coordinates of the crop rectangle relative to the output image size

Что я должен изменить в приведенном ниже коде, чтобы сказать libjpeg обрезать изображение сразу?

Вот как я могу это реализовать:

  1. Сначала игнорировать top - 1 линии;
  2. Для каждого следующего bottom - top линии:
    1) Считать строку сканирования во временный буфер;
    2) Копирование пикселей из диапазона столбцов [left, right) из временного буфера в целевой буфер.
  3. Прервать декомпрессию.

Но этот код избыточен.

2

Решение

С точки зрения производительности, особенно если исходное изображение имеет высокое разрешение и вам требуется относительно небольшая его часть, возможно, вам следует сначала обрезать / обрезать изображение без потерь без распаковки, что возможно при зернистости 16×16 px (8×8?) и быстро, а затем распаковать, пропустив всего несколько строк и пикселей от полей. Вам может также понравиться этот подход для меньшего количества памяти, используемой для операции.

Если вы немного подрезаете, то, пожалуй, лучший план — начать полную распаковку. Здесь почти нет избыточности.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector