Как использовать функции CImg с пиксельными данными?

#c #cimg

#c #cimg

Вопрос:

Я использую Visual Studio и ищу полезную библиотеку обработки изображений, которая позаботится об основных функциях обработки изображений, таких как поворот, чтобы мне не приходилось кодировать их вручную. Я наткнулся на CImg, и он поддерживает это, а также множество других полезных функций, наряду с интерполяцией.

Однако все примеры, которые я видел, показывают, что CImg используется при загрузке и использовании полных изображений. Я хочу работать с пиксельными данными. Итак, мои циклы являются типичными:

 for (x=0;x<width; x  )
for (y=0;y<height; y  )
  

Я хочу выполнить билинейное или бикубическое вращение в этом экземпляре, и я вижу, что CImg поддерживает это. Помимо прочего, он предоставляет функции rotate() и get_rotate.

Я не могу найти в Интернете никаких примеров, показывающих, как использовать это с пиксельными данными. В идеале я мог бы просто передать ему цвет пикселя, x, y и метод интерполяции и заставить его вернуть результат.

Кто-нибудь может предоставить какие-либо полезные предложения? Если CImg не является подходящей библиотекой для этого типа, может ли кто-нибудь порекомендовать простую, облегченную и удобную в использовании библиотеку?

Спасибо!

Комментарии:

1. что имеет большее значение, чем заголовки цикла, которые вы используете для перебора ваших пиксельных данных, так это расположение в памяти. Это RBG с чередованием, это цветовые плоскости, у него есть шаг строки или он плотно упакован? Если у вас есть эта информация, вы могли бы обернуть указатель на данные изображения с помощью «общего» CImg и выполнить операции на месте без дополнительного копирования.

2. Я не понимаю вашего вопроса. Вы видели, что CImg использовался только с полными изображениями — вы каким-то образом хотите обработать часть изображения? Вы хотите использовать циклы — отлично, вы можете использовать циклы с CImg. Вы хотите использовать пиксельные данные — все растровые изображения содержат пиксельные данные, так что же мешает вам обрабатывать пиксельные данные. Вы можете создать CImg, содержащий пиксельные данные. Я не понимаю, с какой частью у вас возникли проблемы.

Ответ №1:

Вы можете скопировать пиксельные данные в CImg класс с помощью итераторов и скопировать их обратно, когда закончите.

 std::vector<uint8_t> pixels_src, pixels_dst;
size_t width, height, n_colors;

// Copy from pixel data
cimg_library::CImg<uint8_t> image(width, height, 1, n_colors);
std::copy(pixels_src.begin(), pixels_src.end(), image.begin());

// Do image processing

// Copy to pixel data
pixels_dst.resize(width * height * n_colors);
std::copy(image.begin(), image.end(), pixels_dst.begin());