如何使用FreeImage加载RAW 16位灰度图像?

我有原始数据的unsigned char*缓冲区。我知道它的尺寸以像素为单位,我知道它是16位灰度。

我正在尝试加载

FIBITMAP* bmp = FreeImage_ConvertFromRawBits(buffer, 1000, 1506, 2000, 16, 0, 0, 0);

并获得损坏的RGB888图像。目前尚不清楚我应该为灰度使用哪种颜色的蒙版,因为它只有一个通道。

最佳答案

经过多次实验,我发现FreeImage_ConvertFromRawBitsEx部分有效的解决方案:

FIBITMAP* bmp = FreeImage_ConvertFromRawBitsEx(true, buffer, FIT_UINT16, 1000, 1506, 2000, 16, 0xFFFF, 0xFFFF, 0xFFFF);

(感谢@ 1201ProgramAlarm带有掩码的提示)。

这样,FreeImage将以某种半自定义格式加载数据。大多数转换和保存功能(尝试过:JPG,PNG,BMP,TIF)都会失败。

由于无法加载本机16位格式的数据,因此我倾向于将其转换为8位灰度
unsigned short* buffer = new unsigned short[1000 * 1506];

// load data

unsigned char* buffer2 = new unsigned char[1000 * 1506];
for (int i = 0; i < 1000 * 1506; i++)
  buffer2[i] = (unsigned char)(buffer[i] / 256.f);

FIBITMAP* bmp = FreeImage_ConvertFromRawBits(buffer2, 1000, 1506, 1000, 8, 0xFF, 0xFF, 0xFF, true);

这确实不是最佳解决方案,我什至不想将其标记为正确答案(将等待更好的结果)。但是在此之后,该格式对于FreeImage将很方便,并且可以将数据保存/转换为其他格式。

关于c++ - 用FreeImage加载RAW灰度图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48245949/

10-11 16:18