Библиотека CImg создает искаженные изображения при вращении

Я хочу использовать библиотеку CImg (http://cimg.sourceforge.net/) для поворота изображения с произвольный угол (изображение читается Qt, который не должен выполнять поворот):

QImage img("sample_with_alpha.png");
img = img.convertToFormat(QImage::Format_ARGB32);

float angle = 45;

cimg_library::CImg<uint8_t> src(img.bits(), img.width(), img.height(), 1, 4);
cimg_library::CImg<uint8_t> out = src.get_rotate(angle);

// Further processing:
// Data: out.data(), out.width(), out.height(), Stride: out.width() * 4

Окончательные данные в "out.data()" в порядке, когда угол установлен на 0. Но для других углов выходные данные искажаются. Я предполагаю, что библиотека CImg меняет формат вывода и/или шаг во время вращения?

С уважением,


person Hyndrix    schedule 18.01.2014    source источник


Ответы (1)


CImg не хранит пиксельный буфер изображения в чередующемся режиме, как RGBARGBARGBA..., но использует поканальную структуру RRRRRRRR.....GGGGGGGGG.......BBBBBBBBB.....AAAAAAAAAA. Я предполагаю, что ваш указатель img.bits() указывает на пиксели с чередующимися каналами, поэтому, если вы хотите передать это в CImg, вам нужно будет изменить структуру буфера, прежде чем вы сможете применить какой-либо метод CImg. Попробуй это :

cimg_library::CImg<uint8_t> src(img.bits(), 4,img.width(), img.height(), 1);
src.permute_axes("yzcx");
cimg_library::CImg<uint8_t> out = src.get_rotate(angle);
// Here, the out image should be OK, try displaying it with out.display();
// But you still need to go back to an interleaved image pointer if you want to
// get it back in Qt.
out.permute_axes("cxyz");   // Do the inverse permutation.
const uint8_t *p_out = out.data();  // Interleaved result.

Я думаю, это должно работать так, как ожидалось.

person bvalabas    schedule 18.01.2014
comment
ПРИМЕЧАНИЕ. После перестановки ширина, высота, спектр и глубина, о которых сообщает CImg, изменятся! Будьте осторожны, чтобы не тратить время, как я сделал сегодня - person Maghoumi; 05.11.2014