首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetDIBits帮助

GetDIBits帮助
EN

Stack Overflow用户
提问于 2011-09-21 20:34:05
回答 1查看 1.6K关注 0票数 0

我正在尝试使用以下代码使用getDIBits获取1bpp位图的比特:

代码语言:javascript
复制
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的第二次调用返回了正确的扫描行数。有没有人能告诉我为什么是这样的?任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2011-09-21 23:52:48

当您第一次调用GetDIBits时,您将获得兼容DC的像素格式,而不是原始像素格式。在DC中选择位图并不会将DC设置为使用位图的像素格式,而是会将位图转换为屏幕的格式。(我怀疑您加载图像的方式也会将位图转换为屏幕的像素格式。)

加载位图时,您可能希望通过将LR_CREATEDIBSECTION添加到LoadImage中的选项来将其作为DIBSECTION加载。这将保持位的原始像素格式。

如果希望以特定的像素格式输出位,则应手动将bmpInfo结构初始化为所需的格式,然后调用GetDIBits

如果你想要原始文件像素格式的位数,你可能甚至不需要GetDIBits。如果您在LoadImage上使用LR_CREATEDIBSECTION,则可以使用GetObject获取DIBSECTION,其中包含格式(可能还有指向这些位的指针)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7499801

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档