不想学习的奈何 2024-11-15 13:13 采纳率: 50%
浏览 18
已结题

C++通过HICON获取argb像素数组

通过窗口句柄获取到了HICON,现在需要通过hicon来获取图标的argb像素数组

我尝试使用GetIconInfo和GetObject获取位图信息,但是每次都获取到一个256*256像素的数据,并且数据和我的图标像素数据不匹配

窗口句柄可以自己获取,也可以用spy++自己定义,现在需要去拿图标的像素数据,也就是显示在任务栏的那个应用图标

Windows

  • 写回答

28条回答 默认 最新

  • 路漫漫,其修远兮 2024-11-15 22:09
    关注

    chatgpt回答如下

    在 Windows 中,如果你已经通过窗口句柄(HWND)获得了图标句柄(HICON),并且想要获取任务栏显示图标的像素数据,你可能遇到了一些问题,比如通过 GetIconInfoGetObject 获取到的位图数据大小与实际图标的像素数据不匹配。这是因为你可能获取的是系统默认的 256x256 大小的图标数据,而你期望的是与实际图标大小相符的 ARGB 数据。

    下面是一个更为准确的方法来获取图标的像素数据:

    步骤概述

    1. 使用 GetIconInfo 获取图标的信息,包括其位图(HBITMAP)。
    2. 使用 GetObjectGetDIBits 获取图标位图的实际像素数据。
    3. 转换为 ARGB 格式的像素数据。

    详细步骤

    1. 获取图标信息

    首先,你已经通过 GetIconInfo 获得了一个 ICONINFO 结构体,这包含了一个 HBITMAP 类型的位图句柄(hbmColor)。

    ICONINFO iconInfo;
    GetIconInfo(hIcon, &iconInfo);  // hIcon 是你的 HICON
    HBITMAP hBitmap = iconInfo.hbmColor;  // 获取颜色位图
    

    2. 获取图标位图的尺寸和像素数据

    可以通过 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 数据
    

    3. 解释图标像素数据

    pPixelData 数组现在包含了图标的像素数据,每个像素由 4 字节表示(A, R, G, B)。你可以根据需要处理这些数据。

    4. 清理

    不要忘了释放资源:

    delete[] pPixelData;
    

    注意事项

    • 图标可能包含多种分辨率(例如,16x16, 32x32, 48x48, 256x256)。通过 GetIconInfo 你只能获取到一个尺寸的位图。如果你需要其他尺寸的图标(比如 32x32),你可能需要使用 ExtractIconEx 来提取多个尺寸的图标。
    • 如果需要进一步优化内存管理或图像格式,可以考虑使用 GDI+,它提供了更强大的图像处理能力。

    通过这种方法,你就能够准确获取显示在任务栏的图标的 ARGB 像素数据,并根据需要进行处理。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(27条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月18日
  • 已采纳回答 11月18日
  • 创建了问题 11月15日