我正在尝试使用以下代码使用getDIBits获取1bpp位图的比特:
HDC dcmem=NULL;
PBYTE buf=NULL;
LPBITMAPINFO bmpInfo;
HBITMAP bmpfile = NULL;
int dibLineCount;
//load bitmap
bmpfile = (HBITMAP)LoadImageA(NULL, FILENAME, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if(!bmpfile)
{
//Load Image failed
return 0;
}
//select bitmap to dc
dcmem = CreateCompatibleDC ( NULL );
if (NULL==SelectObject(dcmem,bmpfile))
{
//select object failed
DeleteDC(dcmem);
return 0;
}
bmpInfo = (LPBITMAPINFO)calloc(1,sizeof(BITMAPINFO));
bmpInfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
//getDIBits to fill bmpInfo
dibLineCount = GetDIBits(dcmem,bmpfile,0,0,NULL,bmpInfo,DIB_RGB_COLORS);
if(dibLineCount == 0)
{
//getdibits 1 failed
DeleteDC(dcmem);
free(bmpInfo);
return 0;
}
if(bmpInfo->bmiHeader.biSizeImage <= 0)
bmpInfo->bmiHeader.biSizeImage=bmpInfo->bmiHeader.biWidth*abs(bmpInfo->bmiHeader.biHeight)*(bmpInfo->bmiHeader.biBitCount+7)/8;
if((buf = (PBYTE)malloc(bmpInfo->bmiHeader.biSizeImage)) == NULL)
return 0;
bmpInfo->bmiHeader.biCompression =BI_RGB;
//get bits
dibLineCount = GetDIBits(dcmem,bmpfile,0,bmpInfo->bmiHeader.biHeight,buf,bmpInfo,DIB_RGB_COLORS);
if(dibLineCount == 0)
{
//getdibits 2 failed
DeleteDC(0,dcmem);
free(buf);
free(bmpInfo);
return 0;
}然后,我使用winsock将这些位发送到另一台PC。但每次我发送带有位的数据包时,我看到位只包含句点"...“或者十六进制的FF,这是非常奇怪的。我看到对getDIBits的第二次调用返回了正确的扫描行数。有没有人能告诉我为什么是这样的?任何帮助都将不胜感激。
发布于 2011-09-21 23:52:48
当您第一次调用GetDIBits时,您将获得兼容DC的像素格式,而不是原始像素格式。在DC中选择位图并不会将DC设置为使用位图的像素格式,而是会将位图转换为屏幕的格式。(我怀疑您加载图像的方式也会将位图转换为屏幕的像素格式。)
加载位图时,您可能希望通过将LR_CREATEDIBSECTION添加到LoadImage中的选项来将其作为DIBSECTION加载。这将保持位的原始像素格式。
如果希望以特定的像素格式输出位,则应手动将bmpInfo结构初始化为所需的格式,然后调用GetDIBits。
如果你想要原始文件像素格式的位数,你可能甚至不需要GetDIBits。如果您在LoadImage上使用LR_CREATEDIBSECTION,则可以使用GetObject获取DIBSECTION,其中包含格式(可能还有指向这些位的指针)。
https://stackoverflow.com/questions/7499801
复制相似问题