Блок задач

11. Многопоточность

Сложность 6

Задача «Масштабирование изображений»

При последовательной обработке видео, часто возникают проблемы с производительностью. Особенно остро проблема возникает при обработке 4k видео (3840x2160 и более)

Постановка задачи

Разработать класс, позволяющий изменять размеры картинок используя пул потоков.

Примерный интерфейс класса. (Публичные методы)

struct BGRA {
    uint8_t Blue;
    uint8_t Green;
    uint8_t Red;
    uint8_t Alpha;
};

struct image {
    BGRA* data; // указатель на данные
    int width;  // ширина картинки
    int height; // высота картинки
    int stride_pixels;  // длина строки данных в пикселях, позволяет обрабатывать части картинок.
};

class BmpResize {
public:
    BmpResize(int threads_cnt = -1);
    ~BmpResize();
    bool Resize(const image& src, image& dst, bool save_aspect = true);
}
  • BmpResize(int threads_cnt = -1); - конструктор. threads_cnt - кол-во потоков обработки. Если равен -1, определять автоматически, в зависимости от размеров картинок.
  • ~BmpResize(); - деструктор. Очищает внутренние ресурсы.
  • bool Resize(const image& src, image& dst, bool save_aspect = true); - Изменение размера картинки.

Замечание

  1. Изменение размера возможно в 'не кратное' кол-во раз. Например: 1280x720 -> 720x576 уменьшение в 1.777777777777778 раз, или наорборот 720x576 -> 1280x720 увеличение в 1.777777777777778 раз.

  2. Необходимо различать увеличение и уменьшение картинок.

    • Увеличение картинок можно делать интерполяцией по двум соседним, исходным пикселям с весами соответствующими текущему (дробному) шагу.
    • Уменьшение - вычисление среднего значения 'схлопывающихся' пикселей.
  3. Распределение на потоки обработки, должно происходить путём разбиения картинок (исходной и конечной) на горизонтальные полосы (слайсы) и пердачей их (слайсы) на индивидуальную обработку.

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

  5. Необходимо предусмотреть многократное применение одного экземпляра класса (для разных картинок).