Монохромное изображение UINT16 в 8-битное монохромное Qimage с использованием freeImage

Я хочу преобразовать монохромное изображение UINT16 в 8-битное изображение на C++.

У меня есть это изображение в

char *buffer;

Я хотел бы передать новый преобразованный буфер в QImage (Qt).

Я пытаюсь использовать freeImagePlus.

fipImage fimage;
if (fimage.loadfromMemory(...) == false)
    //error

loadfromMemory нужен адрес fipMemoryIO:

loadfromMemory (fipMemoryIO &memIO, флаг int = 0)

So I do

fipImage fimage;
BYTE *buf = (BYTE*)malloc(gimage.GetBufferLength() * sizeof(BYTE));
// 'buf' is empty, I have to fill it with 'buffer' content
// how can I do it?
fipMemoryIO memIO(buf, gimage.GetBufferLength());

fimage.loadFromMemory(memIO);
if (fimage.convertTo8Bits() == true)
    cout << "Good";

Тогда я бы сделал что-то вроде

fimage.saveToMemory(...

or

fimage.saveToHandle(...

Я не понимаю, что такое FREE_IMAGE_FORMAT, который является первым аргументом любой из этих двух функций. Я не могу найти информацию об этих типах в документации freeImage.

Тогда я закончу с

imageQt = new QImage(destiny, dimX, dimY, QImage::Format_Indexed8);

Как я могу заполнить 'buf' содержимым начального буфера?

И получить данные из fipImage в данные uchar * для QImage?

Спасибо.


person Mark A.    schedule 28.04.2012    source источник


Ответы (1)


Преобразование легко выполнить на старом добром C++, внешние библиотеки не нужны, если только они не будут значительно быстрее, и вам небезразлично такое ускорение. Ниже показано, как я бы сделал преобразование, по крайней мере, в качестве первого варианта. Данные преобразуются внутри входного буфера, так как выход меньше, чем вход.

QImage from16Bit(void * buffer, int width, int height) {
   int size = width*height*2; // length of data in buffer, in bytes
   quint8 * output = reinterpret_cast<quint8*>(buffer);
   const quint16 * input = reinterpret_cast<const quint16*>(buffer);
   if (!size) return QImage;
   do {
      *output++ = *input++ >> 8;
   } while (size -= 2);
   return QImage(output, width, height, QImage::Format_Indexed8);
}
person Kuba hasn't forgotten Monica    schedule 29.05.2012