Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 颜色显示不正确_Winapi_Gdi - Fatal编程技术网

Winapi 颜色显示不正确

Winapi 颜色显示不正确,winapi,gdi,Winapi,Gdi,为了学习Windows API,我正在尝试使用我买的廉价指纹设备。 随附的库将指纹捕获为256x280像素的8位位图,并将原始像素存储在缓冲区中 我正在尝试将这个原始像素流复制到一个设备独立位图(DIB)中,然后尝试使用这个DIB在窗口上绘制 我设法显示了图像,但颜色都错了。这是处理这幅画的一段代码 PAINTSTRUCT ps; HDC hdc,memDC; HBITMAP cp_bmp; HBITMAP di_bmp; BITMAPINFO di_bmp_info; void *di_b

为了学习Windows API,我正在尝试使用我买的廉价指纹设备。 随附的库将指纹捕获为256x280像素的8位位图,并将原始像素存储在缓冲区中

我正在尝试将这个原始像素流复制到一个设备独立位图(DIB)中,然后尝试使用这个DIB在窗口上绘制

我设法显示了图像,但颜色都错了。这是处理这幅画的一段代码

PAINTSTRUCT ps;
HDC hdc,memDC;

HBITMAP cp_bmp;

HBITMAP di_bmp;
BITMAPINFO di_bmp_info;
void *di_bmp_data;

int ptr;
int x,y;

int aux;

ZeroMemory(&di_bmp_info,sizeof(BITMAPINFO));
di_bmp_info.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
di_bmp_info.bmiHeader.biWidth=256;
di_bmp_info.bmiHeader.biHeight=280;
di_bmp_info.bmiHeader.biPlanes=1;
di_bmp_info.bmiHeader.biBitCount=8;
di_bmp_info.bmiHeader.biCompression=BI_RGB;

hdc=BeginPaint(hwnd,&ps);

// create the DIB
di_bmp=CreateDIBSection(hdc,&di_bmp_info,DIB_RGB_COLORS,&di_bmp_data,NULL,0);

// Copy the original bitstream onto the DIB
CopyMemory(di_bmp_data,fingerprint,256*280);

// create the mem dc
memDC=CreateCompatibleDC(hdc);

// create the DDB
cp_bmp=CreateCompatibleBitmap(hdc,256,280);
SelectObject(memDC,cp_bmp);

SetDIBits(memDC,cp_bmp,0,280,di_bmp_data,&di_bmp_info,DIB_RGB_COLORS);
BitBlt(hdc,10,10,256,280,memDC,0,0,SRCCOPY);
DeleteObject(cp_bmp);   
EndPaint(hwnd,&ps);
奇怪的是,当我将
di\u bmp\u info.bmiHeader.biBitCount
更改为32时,颜色显示得非常完美,但图像的大小变小了,并且在水平方向上重复了大约5到6次


我卡住了!。提前感谢。

简而言之,您有一个索引位图(每个像素不是RGB值,而是定义颜色调色板的索引),但您没有提供调色板供其使用

BITMAPINFO
是一个大小可变的结构-一个
BITMAPINFO头
,后面至少有一个但可能有更多的
RGBQUAD
结构。对于索引位图深度(8 bpp及以下),需要在内存中的
BitMapInfo头
后面提供调色板


所需的调色板条目的数量由
bibibitcount
biclrued
字段确定。如果
biClrUsed
为0,调色板条目的数量必须
1简言之,您有一个索引位图(每个像素不是RGB值,而是定义颜色调色板的索引),并且您没有提供调色板供其使用

BITMAPINFO
是一个大小可变的结构-一个
BITMAPINFO头
,后面至少有一个但可能有更多的
RGBQUAD
结构。对于索引位图深度(8 bpp及以下),需要在内存中的
BitMapInfo头
后面提供调色板


所需的调色板条目的数量由
bibibitcount
biclrued
字段确定。如果
biClrUsed
为0,调色板条目的数量必须为
1您是否有关于从指纹读取器获取的像素数据格式的更多具体信息?例如,能否提供第一行像素的十六进制转储?此外,如果只是将DIB绘制到窗口DC,则不需要兼容位图;您可以在兼容的DC中选择独立于设备的HBITMAP,它应该可以正常工作。您是否有关于从指纹读取器获取的像素数据格式的更多具体信息?例如,能否提供第一行像素的十六进制转储?此外,如果只是将DIB绘制到窗口DC,则不需要兼容位图;您可以在兼容DC中选择独立于设备的HBITMAP,它应该可以完美工作。
struct MyBitmapInfo
{
    BITMAPINFOHEADER bmiHeader;
    RGBQUAD palette[256];
};
struct MyBitmapInfo di_bmp_info;

ZeroMemory(&di_bmp_info,sizeof(struct MyBitmapInfo));
di_bmp_info.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
di_bmp_info.bmiHeader.biWidth=256;
di_bmp_info.bmiHeader.biHeight=280;
di_bmp_info.bmiHeader.biPlanes=1;
di_bmp_info.bmiHeader.biBitCount=8;
di_bmp_info.bmiHeader.biCompression=BI_RGB;

// initialise greyscale palette
for (int i = 0; i < 256; i++)
{
    di_bmp_info.palette[i].rgbRed =
    di_bmp_info.palette[i].rgbGreen =
    di_bmp_info.palette[i].rgnBlue = i;
}