【转】如何从HDC中获取位图信息
来源:互联网 发布:淘宝好评怎么写 编辑:程序博客网 时间:2024/05/16 18:22
// 从DC中获取位图
int GetBmpFromDc()
{
HDC hMemDC;
HBITMAP hBmp;
BITMAP bmp;
HANDLE hOld;
HDC hDC;
RECT rcWnd;
// 获取子窗口的绘图区域
::GetWindowRect(m_hWnd, &rcWnd);
// 计算子窗口绘图区域的宽度和高度
int nWidth = rcWnd.right - rcWnd.left;
int nHeight = rcWnd.bottom - rcWnd.top;
// 获取子窗口 DC
hDC = ::GetDC(m_hWnd);
if (! hDC)
{
m_bBmpIsValid = false;
return FALSE;
}
// 将窗口内容复制到内存 DC 中
hMemDC = CreateCompatibleDC(hDC);
hBmp = CreateCompatibleBitmap(hDC, nWidth, nHeight);
hOld = SelectObject(hMemDC, hBmp);
BOOL rt = BitBlt(hMemDC, 0, 0, nWidth, nHeight, hDC, 0, 0, SRCCOPY);
if (! rt)
{
m_bBmpIsValid = false;
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd, hDC);
return FALSE;
}
// 从内存 DC 中获取 BITMAP
hBmp = (HBITMAP) SelectObject(hMemDC, hOld);
// 获取位图基本信息
::GetObject(hBmp, sizeof(bmp), &bmp);
// 获取位图头信息
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biBitCount = 0;
if (! GetDIBits(hMemDC, hBmp, 0, 1, NULL, &bmpInfo, DIB_RGB_COLORS))
{
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd, hDC);
return FALSE;
}
// 设置位图的压缩格式为 BI_RGB,16位时像素格式为RGB555
bmpInfo.bmiHeader.biCompression = BI_RGB;
// 分配内存,用于存储位图数据
bmp.bmBits = (LPVOID) GlobalAlloc(GMEM_FIXED,
bmpInfo.bmiHeader.biSizeImage);
// 获取位图数据
if (NULL != bmp.bmBits && ! GetDIBits(hMemDC, hBmp, 0,
(WORD) bmp.bmHeight, (LPVOID) bmp.bmBits, &bmpInfo, DIB_RGB_COLORS))
{
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::GlobalFree((HGLOBAL) bmp.bmBits);
::ReleaseDC(m_hWnd, hDC);
return FALSE;
}
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd, hDC);
m_bBmpIsValid = true;
return TRUE;
}
int GetBmpFromDc()
{
HDC hMemDC;
HBITMAP hBmp;
BITMAP bmp;
HANDLE hOld;
HDC hDC;
RECT rcWnd;
// 获取子窗口的绘图区域
::GetWindowRect(m_hWnd, &rcWnd);
// 计算子窗口绘图区域的宽度和高度
int nWidth = rcWnd.right - rcWnd.left;
int nHeight = rcWnd.bottom - rcWnd.top;
// 获取子窗口 DC
hDC = ::GetDC(m_hWnd);
if (! hDC)
{
m_bBmpIsValid = false;
return FALSE;
}
// 将窗口内容复制到内存 DC 中
hMemDC = CreateCompatibleDC(hDC);
hBmp = CreateCompatibleBitmap(hDC, nWidth, nHeight);
hOld = SelectObject(hMemDC, hBmp);
BOOL rt = BitBlt(hMemDC, 0, 0, nWidth, nHeight, hDC, 0, 0, SRCCOPY);
if (! rt)
{
m_bBmpIsValid = false;
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd, hDC);
return FALSE;
}
// 从内存 DC 中获取 BITMAP
hBmp = (HBITMAP) SelectObject(hMemDC, hOld);
// 获取位图基本信息
::GetObject(hBmp, sizeof(bmp), &bmp);
// 获取位图头信息
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biBitCount = 0;
if (! GetDIBits(hMemDC, hBmp, 0, 1, NULL, &bmpInfo, DIB_RGB_COLORS))
{
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd, hDC);
return FALSE;
}
// 设置位图的压缩格式为 BI_RGB,16位时像素格式为RGB555
bmpInfo.bmiHeader.biCompression = BI_RGB;
// 分配内存,用于存储位图数据
bmp.bmBits = (LPVOID) GlobalAlloc(GMEM_FIXED,
bmpInfo.bmiHeader.biSizeImage);
// 获取位图数据
if (NULL != bmp.bmBits && ! GetDIBits(hMemDC, hBmp, 0,
(WORD) bmp.bmHeight, (LPVOID) bmp.bmBits, &bmpInfo, DIB_RGB_COLORS))
{
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::GlobalFree((HGLOBAL) bmp.bmBits);
::ReleaseDC(m_hWnd, hDC);
return FALSE;
}
// 释放资源
::DeleteObject(hBmp);
::DeleteDC(hMemDC);
::ReleaseDC(m_hWnd, hDC);
m_bBmpIsValid = true;
return TRUE;
}
- 【转】如何从HDC中获取位图信息
- MFC中获取HDC
- objective-c中如何从UIImage中获取像素信息
- 如何从DirectX诊断工具对话框中获取信息
- 如何从JVM中获取信息来进行调整
- 如何从mp4文件中获取帧率信息
- android:如何从照片中获取拍摄地址信息
- 如何从网络中获取json数据信息
- 如何从网络中获取json数据信息(补)
- 从位图获取像素
- 如何从HDC建立一个CDC类?
- 如何从HDC建立一个CDC类?
- 从Class中获取信息
- 获取HDC
- 显示从另一类中获取到位图句柄
- 从资源中获取位图的两种方法
- 从HBITMAP变量中获取位图的宽和高
- 如何从appstore获取应用程序信息
- C++第2周项目3——用结构体数组作计算
- c# 生成随机数
- Linux内核编程入门级(经过仔细调试)
- Oracle之数据完整性
- ASP.NET中有几种页面传值方法
- 【转】如何从HDC中获取位图信息
- c语言中数组名代表数组首地址,它的值在运行期间可以改变吗?
- 有关对象指针的使用方法
- Oracle之创建与管理表
- Win32多线程程序设计(一)
- Java栈与堆
- oracle之神奇的游标
- 记事本
- Symbol Paths