如何获取指定DC的RGB数据??

xychzh 2011-11-13 10:53:16

HDC hDC = ::GetDC(NULL);
HBITMAP hMainSurface = ::CreateCompatibleBitmap(hDC, 800, 600); // 主画布
::ReleaseDC(NULL, hDC);

while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}

HDC hMainDC = ::GetDC(hWnd);

// 绘制部分
{
RECT rcRect = { 0, 0, 800, 600 };
FillRect(hMainDC, &rcRect, CreateSolidBrush(RGB(255, 255, 255)));

(HBITMAP)::SelectObject(hMainDC, hMainSurface);

TextOutA(hMainDC, 10, 10, "test", strlen("test"));

// 请问在这里如何获取当前hMainDC中的RGB数据?我想读出来,以进行混合运算
// 另一方面,此时的主画布hMainSurface中有RGB像素么?我用GetBitmapBits()获取好像什么都没有。
}

::ReleaseDC(hWnd, hMainDC);
}



问题见代码。。
...全文
240 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xychzh 2011-11-14
  • 打赏
  • 举报
回复
代码整理成了一个函数:

// 保存窗口图像为tga文件
void PrintScreen(HDC hSrcDC, HBITMAP hBitmap, const char* szFile)
{
BYTE* pBmp = (BYTE*)malloc(800*600*3);
UINT* pBmp32 = (UINT*)malloc(800*600*sizeof(UINT));

{
HDC hMemoryDC = CreateCompatibleDC(NULL);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemoryDC, hBitmap);
StretchBlt(hMemoryDC, 0, 0, 800, 600, hSrcDC, 0, 0, 800, 600,SRCCOPY);

BITMAPINFO bmpInfo;
memset(&bmpInfo, 0, sizeof(bmpInfo));
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = 800;
bmpInfo.bmiHeader.biHeight = 600;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biBitCount = 24;

GetDIBits(hMemoryDC, hBitmap, 0, 600, pBmp, &bmpInfo, DIB_RGB_COLORS);

if (hOldBitmap != NULL)
{
::SelectObject(hMemoryDC, hOldBitmap);
}
}

BYTE* pSrc = pBmp;

#define CZGDI_RGB(r, g, b) ((r<<16) | (g<<8) | b)

for (int h=0; h<600; h++)
{
for (int w=0; w<800; w++)
{
BYTE r = *pSrc++;
BYTE g = *pSrc++;
BYTE b = *pSrc++;
pBmp32[h*800+w] = CZGDI_RGB(r, g, b) | 0xff000000;
}
}

// 保存
SaveTgaFile(szFile, pBmp32, 800, 600);

free(pBmp32);
free(pBmp);
}

其中,SaveTgaFile()函数是自己写的,功能是将32位的bmp数据写成tga文件。
xychzh 2011-11-14
  • 打赏
  • 举报
回复
解决了,代码:

HDC hMemDC = CreateCompatibleDC(NULL);

HDC hDC = ::GetDC(NULL);
HBITMAP hMainSurface = ::CreateCompatibleBitmap(hDC, 800, 600);
::ReleaseDC(NULL, hDC);

while (TRUE)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}

HDC hMainDC = ::GetDC(hWnd);

// 绘制部分
{
RECT rcRect = { 0, 0, 800, 600 };
FillRect(hMainDC, &rcRect, CreateSolidBrush(RGB(255, 255, 255)));

(HBITMAP)::SelectObject(hMainDC, hMainSurface);

TextOutA(hMainDC, 10, 10, "test", strlen("test"));

if (GetKeyState(VK_F1) & 0x8000)
{
BYTE* pBmp = (BYTE*)malloc(800*600*3);

{
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hMainSurface);
StretchBlt(hMemDC, 0, 0, 800, 600, hMainDC, 0, 0, 800, 600,SRCCOPY);

BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = 800;
bmpInfo.bmiHeader.biHeight = 600;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biBitCount = 24;

GetDIBits(hMemDC, hMainSurface, 0, 600, pBmp, &bmpInfo, DIB_RGB_COLORS);
}

// 保存
SaveTgaFile("out.tga", pBmp, 800, 600);

free(pBmp32);

free(pBmp);
}
}

::ReleaseDC(hWnd, hMainDC);

Sleep(60);
}
gibsonboy 2011-11-14
  • 打赏
  • 举报
回复
CDC::GetPixel
COLORREF GetPixel(int x,int y) const;
COLORREF GetPixel(POINT point) const;
返回值:对于函数的两种形式,则返回给定点的RGB值
另外这三个,也许你会用到 GetRValue,GetGValue,GetBValue
xychzh 2011-11-14
  • 打赏
  • 举报
回复
等待懂GDI的大侠。
xychzh 2011-11-14
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 huangminnei 的回复:]
HDC hMemoryDC = CreateCompatibleDC(NULL);
要delete 啊!要释放啊! 求给分,下东西
[/Quote]

恩,明白,只是该函数不是拿来用的,仅参考用。
  • 打赏
  • 举报
回复
先给分。。。自然就有答案了。
huangminnei 2011-11-14
  • 打赏
  • 举报
回复
HDC hMemoryDC = CreateCompatibleDC(NULL);
要delete 啊!要释放啊! 求给分,下东西
xychzh 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wltg2001 的回复:]
引用 3 楼 xychzh 的回复:
引用 1 楼 wltg2001 的回复:
GetDIBits试试


没用的,我开始就是用这个函数,都不行。。

不行吗,应该是行的。
[/Quote]

你试过?我可是试了很多遍了。
wltg2001 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xychzh 的回复:]
引用 1 楼 wltg2001 的回复:
GetDIBits试试


没用的,我开始就是用这个函数,都不行。。
[/Quote]
不行吗,应该是行的。
xychzh 2011-11-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wltg2001 的回复:]
GetDIBits试试
[/Quote]

没用的,我开始就是用这个函数,都不行。。
test0231 2011-11-13
  • 打赏
  • 举报
回复
借贵地问一下,我有一个关于OGRE(一款图形引擎)的问题,该到哪个版块问啊?楼下有知道的么?版主在么?
wltg2001 2011-11-13
  • 打赏
  • 举报
回复
GetDIBits试试

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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