请不要被下面的代码数量吓到 关键就几句
我用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]);
}
}
我用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]);
}
}
解决方案 »
- IsWindow中断是怎么回事?
- 我在mainfram里自定义了消息,请问怎样从文档类向mainfram发送这个消息消息
- 线程管理函数的形式是唯一的吗?
- ace的问题,如何发数据
- 迷惑啊!!!!大虾指点一下
- CTreeCtrl的展开,不滚动CTreeCtrl窗口
- 请教Visual C++控件的详细编写过程,50分
- 有关Windows 2000系统安全性
- com+中,dllhost占用的内存一直上升,最后提示存贮器不足,该如何解决?
- 使用listctrl?
- [求助]一个关于如何在MFC单文档中新建窗口的问题,求大神帮帮忙
- MFC 封装 类 最近在对话框中写了一个对Listctrl 控件的自绘代码,如何将它们单独拉出来留出函数接口
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]);
}
}
那个ppvBytes是啥 如何从它获取各个点的RGB值
2:每个的像素点似乎都变得暗淡了。// 为什么 是 DIB_PAL_COLORS ?
我开始使用的是DIB_RGB_COLORS因为出现描述的问题 所以换的您能告诉我得到这个buffer(pvBits)后 怎样通过这个buffer获得每个像素的颜色呢