使用FreeImage加载RAW灰度图像

时间:2018-01-14 01:36:21

标签: c++ freeimage

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

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

我试图用

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

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

2 个答案:

答案 0 :(得分:2)

经过多次实验后,我找到了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,它可以保存/转换数据。

答案 1 :(得分:1)

关于您的问题:我已从他们的PDF文档FreeImage1370.pdf中了解到这一点:

  

FreeImage_ConvertFromRawBits

     

1 4 8 16 24 32

     

<小时/>   DLL_API FIBITMAP * DLL_CALLCONV FreeImage_ConvertFromRawBits(BYTE * bits,int width,int   height,int pitch,unsigned bpp,unsigned red_mask,unsigned green_mask,unsigned   blue_mask,BOOL topdown FI_DEFAULT(FALSE));      将内存中的原始位图转换为FIBITMAP。这个参数   函数用于描述原始位图。第一个参数是指向开头的指针   原始的位。 width和height参数描述位图的大小。球场   定义源位图中扫描线的总宽度,包括可能的填充字节   应用。 bpp参数告诉FreeImage位图的位深度是多少。该   red_mask,green_mask和blue_mask参数告诉FreeImage颜色的位布局   位图中的组件。最后一个参数topdown将存储位图的左上角像素   第一个是TRUE或者左下角像素是FALSE。

     
      
  • 当源位图使用32位填充时,您可以使用。来计算音高   以下公式:   int pitch =((((bpp * width)+ 31)/ 32)* 4);
  •   

在您要显示的代码中:

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

您拥有相应的FIBTMAP*返回类型,并传递了buffer raw bits。从那里2 nd &amp; 3 rd 参数是width&amp; heightwidth = 1000height = 1506和4 th 参数,即pitchpitch = 2000(如果位图使用的是32位) padding参考上面的最后一个注释),5 th 参数将是bpp测量的位深度bpp = 16,接下来的3个参数是RGB color masks 1}}。在这里,您将它们全部标记为0。最后一个参数是orientation的{​​{1}}的bool标志:

image

中省略了该值。

如果没有更多关于您如何阅读文件的代码,解析标题信息等以准备您的 if (topdown == true ) { stores top-left pixel first ) else { bottom left pixel is stored first } ,很难说出哪里可能存在错误或问题,而是根据您提供的内容;我想您需要查看buffer color channel masks

编辑 - 我发现另一个来自standford.edu here的FreeImage的PDF引用旧版本grayscale images但是函数声明 - 定义看起来不像它已经改变了,他们提供了b 3.13.1&amp;的例子。 FreeImage_ConvertToRawBits

Free_Image_ConvertFromRawBits

我认为这可以帮助您解决有关灰度图像中颜色通道的// this code assumes there is a bitmap loaded and // present in a variable called ‘dib’ // convert a bitmap to a 32-bit raw buffer (top-left pixel first) // -------------------------------------------------------------- FIBITMAP *src = FreeImage_ConvertTo32Bits(dib); FreeImage_Unload(dib); // Allocate a raw buffer int width = FreeImage_GetWidth(src); int height = FreeImage_GetHeight(src); int scan_width = FreeImage_GetPitch(src); BYTE *bits = (BYTE*)malloc(height * scan_width); // convert the bitmap to raw bits (top-left pixel first) FreeImage_ConvertToRawBits(bits, src, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, TRUE); FreeImage_Unload(src); // convert a 32-bit raw buffer (top-left pixel first) to a FIBITMAP // ---------------------------------------------------------------- FIBITMAP *dst = FreeImage_ConvertFromRawBits(bits, width, height, scan_width, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK, FALSE); 的问题。