通过窗口句柄获取到了HICON,现在需要通过hicon来获取图标的argb像素数组
我尝试使用GetIconInfo和GetObject获取位图信息,但是每次都获取到一个256*256像素的数据,并且数据和我的图标像素数据不匹配
窗口句柄可以自己获取,也可以用spy++自己定义,现在需要去拿图标的像素数据,也就是显示在任务栏的那个应用图标
Windows
通过窗口句柄获取到了HICON,现在需要通过hicon来获取图标的argb像素数组
我尝试使用GetIconInfo和GetObject获取位图信息,但是每次都获取到一个256*256像素的数据,并且数据和我的图标像素数据不匹配
窗口句柄可以自己获取,也可以用spy++自己定义,现在需要去拿图标的像素数据,也就是显示在任务栏的那个应用图标
Windows
chatgpt回答如下
在 Windows 中,如果你已经通过窗口句柄(HWND)获得了图标句柄(HICON),并且想要获取任务栏显示图标的像素数据,你可能遇到了一些问题,比如通过 GetIconInfo 和 GetObject 获取到的位图数据大小与实际图标的像素数据不匹配。这是因为你可能获取的是系统默认的 256x256 大小的图标数据,而你期望的是与实际图标大小相符的 ARGB 数据。
下面是一个更为准确的方法来获取图标的像素数据:
GetIconInfo 获取图标的信息,包括其位图(HBITMAP)。GetObject 或 GetDIBits 获取图标位图的实际像素数据。首先,你已经通过 GetIconInfo 获得了一个 ICONINFO 结构体,这包含了一个 HBITMAP 类型的位图句柄(hbmColor)。
ICONINFO iconInfo;
GetIconInfo(hIcon, &iconInfo); // hIcon 是你的 HICON
HBITMAP hBitmap = iconInfo.hbmColor; // 获取颜色位图
可以通过 GetObject 获取位图的大小,但实际上你更需要的是图标的实际像素数据。可以使用 GetDIBits 来获取位图的像素信息并将其转换为 ARGB 格式。
BITMAP bitmap;
GetObject(hBitmap, sizeof(BITMAP), &bitmap); // 获取位图信息
int width = bitmap.bmWidth;
int height = bitmap.bmHeight;
// 创建适合 DIB 的内存
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = -height; // 位图的高度为负值,表示从下往上填充
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32; // ARGB
bmi.bmiHeader.biCompression = BI_RGB;
int dataSize = width * height * 4; // 每个像素 4 字节 (ARGB)
BYTE* pPixelData = new BYTE[dataSize];
HDC hdc = GetDC(NULL); // 获取屏幕设备上下文
GetDIBits(hdc, hBitmap, 0, height, pPixelData, &bmi, DIB_RGB_COLORS);
ReleaseDC(NULL, hdc);
// pPixelData 现在包含了图标的 ARGB 数据
pPixelData 数组现在包含了图标的像素数据,每个像素由 4 字节表示(A, R, G, B)。你可以根据需要处理这些数据。
不要忘了释放资源:
delete[] pPixelData;
GetIconInfo 你只能获取到一个尺寸的位图。如果你需要其他尺寸的图标(比如 32x32),你可能需要使用 ExtractIconEx 来提取多个尺寸的图标。GDI+,它提供了更强大的图像处理能力。通过这种方法,你就能够准确获取显示在任务栏的图标的 ARGB 像素数据,并根据需要进行处理。