Я хочу использовать библиотеку 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 меняет формат вывода и / или шаг при вращении?
С Уважением,
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.
Я думаю, это должно работать как ожидалось.
Других решений пока нет …