c++ - GetDIBits 帮助

标签 c++ c gdi winsock

我正在尝试使用以下代码使用 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 的第二次调用返回了正确数量的扫描行。任何人都可以帮助我为什么这些位是这样的?任何帮助将不胜感激。

最佳答案

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

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

如果您想要以特定像素格式输出位,您应该手动将 bmpInfo 结构初始化为您想要的格式,然后调用 GetDIBits .

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

关于c++ - GetDIBits 帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7499801/

相关文章:

C++ 释放静态变量

c - 为什么我添加了多个节点,但我的链表只包含一个节点?

c - 注释中的 "@(#)<filename>"是什么意思?

c - 解析 C 字符串

c++ - 从 COLORREF[] 中绘制 DeviceContext

c++ - BitBlt 问题 GDI

python - 如何在wxpython框架中拖动图像

C# 等效于另一个进程的postthreadmessage

c++ - QPainter 和 QOpenGLWidget 类中的 OpenGL native 代码

c++ - 模板特化中的类型(数组类型的 unique_ptr)