如何解决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 举报,一经查实,本站将立刻删除。