如何使用FreeImage加载RAW 16位灰度图像?
我有unsigned char*
缓冲区和原始数据。我知道它的像素尺寸,我知道它是16位灰度。
我试图用
加载它FIBITMAP* bmp = FreeImage_ConvertFromRawBits(buffer, 1000, 1506, 2000, 16, 0, 0, 0);
并破坏RGB888图像。目前还不清楚我应该使用哪种颜色的灰度,因为它只有一个通道。
答案 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; height
:width = 1000
,height = 1506
和4 th 参数,即pitch
:pitch = 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);
的问题。