微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GetDIBits 不适用于从窗口捕获的 HBITMAP

如何解决GetDIBits 不适用于从窗口捕获的 HBITMAP

我需要获取从窗口和文件 (.bmp) 捕获的图片的像素颜色数据值数组。

我检查了带有断点的调试器。带有从文件创建的 HBITMAP 的 HBITMAP_ToPixelData() 方法返回一个具有正确值的数组,但如果通过捕获创建的 HBITMAP,则返回的数组为空,所有值都为零,而“成功”变量也为零。 GetDIBits() 由于某种原因不起作用,尽管相同的 HBITMAP 已正确传输到剪贴板并插入到照片编辑器中。可能是什么问题?

Main.cpp 代码

#include <windows.h>
#include <iostream>
#include <vector>
#include "ImageProcessing.h"

using namespace std;

int main()
{

    ImageProcessing a1;
    HBITMAP hbmp1 = a1.CaptureWindow(L"Notepad");
    vector<unsigned char> p_data1 = a1.HBITMAP_ToPixelData(hbmp1);

    HBITMAP hbmp2 = a1.HBITMAP_FromFile();
    vector<unsigned char> p_data2 = a1.HBITMAP_ToPixelData(hbmp2);
}

ImageProcessing.h 代码

#pragma once

#include <vector>
#include <windows.h>

using namespace std;

class ImageProcessing
{
#pragma once

public:
    HBITMAP HBITMAP_FromFile() 
    {
        wstring a = L"C:/pic.bmp";
        HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,a.c_str(),IMAGE_BITMAP,LR_LOADFROMFILE);
        return hBitmap;
    } 

    vector<unsigned char> HBITMAP_ToPixelData(HBITMAP hbmp)
    {
        BITMAP bmp = {};
        BITMAPINFO bmp_info = {};
        vector <unsigned char> Pixels = vector <unsigned char>();

        OpenClipboard(NULL);
        EmptyClipboard();
        SetClipboardData(CF_BITMAP,hbmp);
        CloseClipboard();

        HDC DC = CreateCompatibleDC(NULL);
        HGdioBJ old_bmp = SelectObject(DC,hbmp);
        Getobject(hbmp,sizeof(bmp),&bmp);

        int width = bmp.bmWidth;
        int height = bmp.bmHeight;

        bmp_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bmp_info.bmiHeader.biWidth = width;
        bmp_info.bmiHeader.biHeight = height;
        bmp_info.bmiHeader.biPlanes = 1;
        bmp_info.bmiHeader.biBitCount = 24;
        bmp_info.bmiHeader.biCompression = BI_RGB;
        bmp_info.bmiHeader.biSizeImage = width * 3 * height;

        Pixels.resize(bmp_info.bmiHeader.biSizeImage);
        int success = GetDIBits(DC,hbmp,width,&Pixels[0],&bmp_info,DIB_RGB_COLORS);

        SelectObject(DC,old_bmp);
        DeleteDC(DC);

        return Pixels;
    }

    HBITMAP CaptureWindow(wstring window_title)
    {
        SetThreadDpiAwarenessContext(DPI_AWAREnesS_CONTEXT_SYstem_AWARE);
        HWND hwnd = FindWindow(NULL,(window_title.c_str()));
        if (hwnd == NULL)
        {
            return NULL;
        }

        // get window dimentions
        RECT windowsize;
        GetClientRect(hwnd,&windowsize);
        int w = windowsize.right;
        int h = windowsize.bottom;

        // copy window to bitmap
        HDC hdc = GetDC(hwnd);
        HDC hCaptureDC = CreateCompatibleDC(hdc);
        HBITMAP hBitmap = CreateCompatibleBitmap(hdc,w,h);
        HGdioBJ hOld = SelectObject(hCaptureDC,hBitmap);
        BOOL bOK = BitBlt(hCaptureDC,h,hdc,SRCcopY);

        SelectObject(hCaptureDC,hOld);
        DeleteDC(hCaptureDC);
        ReleaseDC(hwnd,hdc);
        return hBitmap;
    }
};

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。