从 PNG 加载 Gdiplus 的 HICON 质量低
HICON loaded with Gdiplus from PNG has low quality
我正在尝试将一些 PNG 图像加载到 WinAPI ImageList
中,作为要在 ListView
中显示的元素的图标。我用 Gdiplus
这样做,我遇到的问题是质量很差。好像颜色深度减少了之类的。
我是这样做的(在从 WinMain
调用的函数中,就在循环之前):
HIMAGELIST hLarge;
HIMAGELIST hSmall;
hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON),
ILC_MASK, 1, 1);
hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_MASK, 1, 1);
ListView_SetImageList(hWndListView, hLarge, LVSIL_NORMAL);
ListView_SetImageList(hWndListView, hSmall, LVSIL_SMALL);
HICON hIconItem
Gdiplus::Bitmap *bitmap = new Gdiplus::Bitmap(image_path, 0);
bitmap->GetHICON(&hIconItem);
ImageList_AddIcon(hSmall, hiconItem);
ImageList_AddIcon(hLarge, hiconItem);
现在,我遗漏了什么?图像在哪里遗漏了信息?
我已经把ILC_MASK
改成了ILC_MASK | ILC_COLOR32
。画质好一点但是没有抗锯齿。
您的 PNG 很可能是 32 位颜色。在您的 ImageList_Create()
调用中,使用标志 ILC_COLOR32 | ILC_MASK
,而不仅仅是 ILC_MASK
。
根据MSDN,如果不指定ILC_COLORxxx
标志之一,则默认为ILC_COLOR4
,即4位16色图形。这解释了您降低的图像质量。明确指定 ILC_COLOR32
将为您提供所需的全彩色图标。
我正在尝试将一些 PNG 图像加载到 WinAPI ImageList
中,作为要在 ListView
中显示的元素的图标。我用 Gdiplus
这样做,我遇到的问题是质量很差。好像颜色深度减少了之类的。
我是这样做的(在从 WinMain
调用的函数中,就在循环之前):
HIMAGELIST hLarge;
HIMAGELIST hSmall;
hLarge = ImageList_Create(GetSystemMetrics(SM_CXICON),
GetSystemMetrics(SM_CYICON),
ILC_MASK, 1, 1);
hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON),
GetSystemMetrics(SM_CYSMICON),
ILC_MASK, 1, 1);
ListView_SetImageList(hWndListView, hLarge, LVSIL_NORMAL);
ListView_SetImageList(hWndListView, hSmall, LVSIL_SMALL);
HICON hIconItem
Gdiplus::Bitmap *bitmap = new Gdiplus::Bitmap(image_path, 0);
bitmap->GetHICON(&hIconItem);
ImageList_AddIcon(hSmall, hiconItem);
ImageList_AddIcon(hLarge, hiconItem);
现在,我遗漏了什么?图像在哪里遗漏了信息?
我已经把ILC_MASK
改成了ILC_MASK | ILC_COLOR32
。画质好一点但是没有抗锯齿。
您的 PNG 很可能是 32 位颜色。在您的 ImageList_Create()
调用中,使用标志 ILC_COLOR32 | ILC_MASK
,而不仅仅是 ILC_MASK
。
根据MSDN,如果不指定ILC_COLORxxx
标志之一,则默认为ILC_COLOR4
,即4位16色图形。这解释了您降低的图像质量。明确指定 ILC_COLOR32
将为您提供所需的全彩色图标。