У меня есть следующий стандартный код для распаковки изображений 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
обрезать изображение сразу?
Вот как я могу это реализовать:
top - 1
линии;bottom - top
линии:[left, right)
из временного буфера в целевой буфер.Но этот код избыточен.
С точки зрения производительности, особенно если исходное изображение имеет высокое разрешение и вам требуется относительно небольшая его часть, возможно, вам следует сначала обрезать / обрезать изображение без потерь без распаковки, что возможно при зернистости 16×16 px (8×8?) и быстро, а затем распаковать, пропустив всего несколько строк и пикселей от полей. Вам может также понравиться этот подход для меньшего количества памяти, используемой для операции.
Если вы немного подрезаете, то, пожалуй, лучший план — начать полную распаковку. Здесь почти нет избыточности.
Других решений пока нет …