2014-01-18 7 views
2

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

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 изменяет выходной формат и/или шаг во время вращения?

Привет,

ответ

4

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. 

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

+0

Спасибо, что указали это! – Hyndrix

+0

ПРИМЕЧАНИЕ. После перестановки ширина, высота, спектр и глубина, о которых сообщает CImg, будут меняться! Осторожно, чтобы не терять время, как сегодня. – M2X

 Смежные вопросы

  • Нет связанных вопросов^_^