问题描述
我需要获取从窗口和文件 (.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 (将#修改为@)