gpt4 book ai didi

c++ - GetDIBits 帮助

转载 作者:行者123 更新时间:2023-11-28 08:16:42 27 4
gpt4 key购买 nike

我正在尝试使用以下代码使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com