求教 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]);
}
}
...全文
126 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
其中这些代码就是我试图获取各个像素点的代码
请教啊 这样做对不对啊
程序运行如截图

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧