求教 CreateDIBSection 100分 在线等

allenhiman 2013-09-05 05:03:41
请不要被下面的代码数量吓到 关键就几句
我用CreateDIBSection 获取了一个LPVOID ppvBytes;
我现在就是不知道这个ppvBytes里面到底存的是什么
我想通过这个ppvBytes获取该位图各个像素点RGB值可以吗?
我用下面的代码做测试 就是给屏幕抓图 我试图输出ppvbytes各个点的颜色
但输出的结果似对非对的 能看出来说桌面的截图 但有两个缺点
1:图像是倒立的
2:每个的像素点似乎都变得暗淡了。

HDC hDesktopDC=CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
int nWidth=GetSystemMetrics(SM_CXSCREEN);
int nHeight=GetSystemMetrics(SM_CYSCREEN);
HDC hCaptureDC=CreateCompatibleDC(hDesktopDC);

CSize sizeWindow( nWidth, nHeight );
BITMAPINFOHEADER stBmpInfoHeader = { 0 };
int nBytesPerLine = ((sizeWindow.cx * 32 + 31) & (~31)) >> 3;
stBmpInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
stBmpInfoHeader.biWidth = sizeWindow.cx;
stBmpInfoHeader.biHeight = sizeWindow.cy;
stBmpInfoHeader.biPlanes = 1;
stBmpInfoHeader.biBitCount = 32;
stBmpInfoHeader.biCompression = BI_RGB;
stBmpInfoHeader.biClrUsed = 0;
stBmpInfoHeader.biSizeImage = nBytesPerLine * sizeWindow.cy;

PVOID pvBits = NULL;
HBITMAP hbmpMem = ::CreateDIBSection(NULL, (PBITMAPINFO)&stBmpInfoHeader, DIB_PAL_COLORS, &pvBits, NULL, 0);

if(hbmpMem != NULL)
{
memset( pvBits, 0, sizeWindow.cx * 4 * sizeWindow.cy);
if(hbmpMem)
{
HGDIOBJ hbmpOld = ::SelectObject( hCaptureDC, hbmpMem);
BitBlt(hCaptureDC,0,0,nWidth,nHeight,hDesktopDC,0,0,SRCCOPY);

}
}
::DeleteObject(hDesktopDC);
::DeleteObject(hCaptureDC);



CDC *pDC = GetDC();
BYTE *pBytes = (BYTE*)pvBits;
int size = sizeWindow.cx * 4 * sizeWindow.cy / 4;
COLORREF *pClrs = new COLORREF[size];
for ( int i = 0; i < size; i++ )
{
pClrs[i] = RGB( pBytes[i*4+1], pBytes[i*4+2], pBytes[i*4+3] );

}

for( int y = 0; y < 200; y++ )
{
for( int x = 0; x < nWidth; x++ )
{
pDC->SetPixel( CPoint(x,y), pClrs[nWidth*y + x]);
}
}
...全文
66 点赞 收藏 8
写回复
8 条回复
allenhiman 2013年09月06日
大感谢了 正式我想要的结果
回复 点赞
allenhiman 2013年09月06日
好的 我试试啊
回复 点赞
zgl7903 2013年09月06日
pClrs[i] = RGB( pBytes[i*4+2], pBytes[i*4+1], pBytes[i*4+0] );
回复 点赞
allenhiman 2013年09月06日
谢谢 schlafenhamster 我开始使用的是DIB_RGB_COLORS因为出现描述的问题 所以换的 您能告诉我得到这个buffer(pvBits)后 怎样通过这个buffer获得每个像素的颜色呢
回复 点赞
schlafenhamster 2013年09月06日
1:图像是倒立的// 原本 就 如此 2:每个的像素点似乎都变得暗淡了。// 为什么 是 DIB_PAL_COLORS ?
回复 点赞
allenhiman 2013年09月05日
其实就是想问 那个ppvBytes是啥 如何从它获取各个点的RGB值
回复 点赞
allenhiman 2013年09月05日
CDC *pDC = GetDC();
BYTE *pBytes = (BYTE*)pvBits;
int size = sizeWindow.cx * 4 * sizeWindow.cy / 4;
COLORREF *pClrs = new COLORREF[size];
for ( int i = 0; i < size; i++ )
{
pClrs[i] = RGB( pBytes[i*4+1], pBytes[i*4+2], pBytes[i*4+3] );

}

for( int y = 0; y < 200; y++ )
{
for( int x = 0; x < nWidth; x++ )
{
pDC->SetPixel( CPoint(x,y), pClrs[nWidth*y + x]);
}
}
回复 点赞
allenhiman 2013年09月05日
其中这些代码就是我试图获取各个像素点的代码
请教啊 这样做对不对啊
程序运行如截图
回复 点赞
发动态
发帖子
界面
创建于2007-09-28

7973

社区成员

11.5w+

社区内容

VC/MFC 界面
社区公告
暂无公告