Библиотека 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 меняет формат вывода и / или шаг при вращении?

С Уважением,

2

Решение

CImg не хранит пиксельный буфер изображения в режиме чередования, как RGBARGBARGBA …, но использует структуру канала за каналом RRRRRRRR ….. GGGGGGGGG ……. BBBBBBBBB ….. AAAAAAAAA.
Я полагаю, ваш 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.

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

4

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

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

По вопросам рекламы [email protected]