我想在C ++中将 UINT16单色图像转换为 8位图像。
我在
中有这个图像char *buffer;
我想将新转换的缓冲区提供给QImage(Qt)。
我正在尝试使用 freeImagePlus
fipImage fimage;
if (fimage.loadfromMemory(...) == false)
//error
loadfromMemory需要一个fipMemoryIO地址:
loadfromMemory(fipMemoryIO& memIO,int flag = 0)
所以我做了
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(...
或
fimage.saveToHandle(...
我不明白什么是FREE_IMAGE_FORMAT,这是这两个函数中的任何一个的第一个参数。我在freeImage文档中找不到这些类型的信息。
然后我结束了
imageQt = new QImage(destiny, dimX, dimY, QImage::Format_Indexed8);
如何用初始缓冲区的内容填充'buf'?
将fipImage中的数据转换为QImage的uchar *数据?
感谢。
答案 0 :(得分:0)
在普通的旧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);
}