【转】如何从HDC中获取位图信息

// 从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;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值