请教一ICON显示的问题

002大破天幕杀机 2009-06-05 02:21:11
在程序中,按一规定在界面上显示一ICON图片,该ICON图片属于彩色的,显示到界面上的时候要求为黑白灰色调的。不知道该如何处理,才能把一彩色调的ICON图片显示成黑白灰色调的。
...全文
62 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
谢谢Quote的引导,从各位的回帖中,我稍微明白了做黑白图片的方法。我记下来这个三个数了(0.299)(0.587)(0.114);
[Quote=引用 10 楼 zhaojiangang 的回复:]
读像素 然后灰色处理。。。


/// <summary>
/// 图片转换为灰度,底色为白色
/// </summary>
/// <param name="source"> </param>
/// <returns> </returns>
public Bitmap ConvertToGrayscale(Bitmap source)
{
Bitmap bm = new Bitmap(source.Width, source.Height);
for (int y = 0; y < bm.Height; y++)
{

[/Quote]
  • 打赏
  • 举报
回复

loganwang,你好,代码中TransparentImage(dc, 1, 1, bm.bmWidth, bm.bmHeight, hd,0, 0, bm.bmWidth, bm.bmHeight, RGB(61, 108, 0)); 这一句中的RGB(61, 108, 0)表示什么意思?我在读代码的时候碰到的这个问题。

[Quote=引用 6 楼 loganwang 的回复:]
这是我用来画Button的方法不知道能不能用 {
HDC dc = lpDis->hDC;
BOOL bIsPressed = (lpDis->itemState & ODS_SELECTED);
BOOL bIsFocused = (lpDis->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDis->itemState & ODS_DISABLED);
RECT itemRect = lpDis->rcItem;

SetBkMode(dc, TRANSPARENT);
if(bIsFocused)
{
HBRUSH br = CreateSolidBrush(RGB(0,0,0));
FrameRe…
[/Quote]
  • 打赏
  • 举报
回复
大侠的方法试验之后,效果不错,非常好用。


[Quote=引用 5 楼 jiangyongtao 的回复:]
在网上找到的代码,楼主试试吧.
时间关系,没有亲自验证,好用楼主在帖子里说一声,方便大家。

C/C++ code
//由彩色ICON生成灰色ICON
HICON CreateGrayscaleIcon(HICON hIcon)
{
HICON hGrayIcon = NULL;
HDC hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
BITMAP bmp;
HBITMAP hOldBmp1 = NULL, hOldBmp2 = NULL;
ICONINFO csII, csGrayII;
BOOL bRetValue = FALSE;

bRetValu…
[/Quote]
chinaonsh 2009-06-12
  • 打赏
  • 举报
回复
把调色板换成黑白的就可以了
fenix124 2009-06-11
  • 打赏
  • 举报
回复
用getpixel和setpixel才是王道呀。。
取得每个点的RGB,然后用取平均或者其他方式得到一个值,然后使该点的RGB设为同一个值即可
  • 打赏
  • 举报
回复
谢谢各位的帮忙,这两天头儿给我指派了一些BUG需要修改,这个问题的优先级放倒BUG之后,所以过段时间试验一下各位指点的方法。
发现心流 2009-06-07
  • 打赏
  • 举报
回复
5楼的方法好

转个icon不需要考虑效率吧

就是12*12,16*16,20*20的3个bitmap
木有效率问题吧
yihan7h 2009-06-06
  • 打赏
  • 举报
回复
灰度图生成,关键点:byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114));

顺便请教楼上,除了用GetPixel,SetPixel还有别的方法吗?
shiyang_x 2009-06-06
  • 打赏
  • 举报
回复
5楼的方法应该是可以的,从RGB计算Y分量.但建议不要用GetPixel,SetPixel,效率太低
loganwang 2009-06-06
  • 打赏
  • 举报
回复
这是我用来画Button的方法不知道能不能用 {
HDC dc = lpDis->hDC;
BOOL bIsPressed = (lpDis->itemState & ODS_SELECTED);
BOOL bIsFocused = (lpDis->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDis->itemState & ODS_DISABLED);
RECT itemRect = lpDis->rcItem;

SetBkMode(dc, TRANSPARENT);
if(bIsFocused)
{
HBRUSH br = CreateSolidBrush(RGB(0,0,0));
FrameRect(dc, &itemRect, br);
InflateRect(&itemRect, -1, -1);
DeleteObject(br);
}
COLORREF crColor = GetSysColor(COLOR_BTNFACE);
HBRUSH brBackground = CreateSolidBrush(crColor);
FillRect(dc, &itemRect, brBackground);
DeleteObject(brBackground);

BITMAP bm;
GetObject(hd, sizeof(bm), &bm);

if(bIsPressed)
{
HBRUSH brBtnShadow = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
FrameRect(dc, &itemRect,brBtnShadow);
DeleteObject(brBtnShadow);
TransparentImage(dc, 1, 1, bm.bmWidth, bm.bmHeight,
hd,
0, 0, bm.bmWidth, bm.bmHeight, RGB(61, 108, 0));
}
}
egmkang 2009-06-06
  • 打赏
  • 举报
回复
WM本来就慢~~
zhaojiangang 2009-06-06
  • 打赏
  • 举报
回复
读像素 然后灰色处理。。。


/// <summary>
/// 图片转换为灰度,底色为白色
/// </summary>
/// <param name="source"></param>
/// <returns></returns>
public Bitmap ConvertToGrayscale(Bitmap source)
{
Bitmap bm = new Bitmap(source.Width, source.Height);
for (int y = 0; y < bm.Height; y++)
{
for (int x = 0; x < bm.Width; x++)
{
Color c = source.GetPixel(x, y);
int luma = (int)(c.R * 0.3 + c.G * 0.59 + c.B * 0.11);
bm.SetPixel(x, y, Color.FromArgb(luma, luma, luma));
}
}
return bm;
}

记得给分啊!!!


不过, 你还是用灰色图片的好, 图形处理多了,,会慢的
egmkang 2009-06-06
  • 打赏
  • 举报
回复
懒得话,让美工做一个灰色Icon嘛
世外涛缘 2009-06-05
  • 打赏
  • 举报
回复
在网上找到的代码,楼主试试吧.
时间关系,没有亲自验证,好用楼主在帖子里说一声,方便大家。

//由彩色ICON生成灰色ICON
HICON CreateGrayscaleIcon(HICON hIcon)
{
HICON hGrayIcon = NULL;
HDC hMainDC = NULL, hMemDC1 = NULL, hMemDC2 = NULL;
BITMAP bmp;
HBITMAP hOldBmp1 = NULL, hOldBmp2 = NULL;
ICONINFO csII, csGrayII;
BOOL bRetValue = FALSE;

bRetValue = ::GetIconInfo(hIcon, &csII);
if (bRetValue == FALSE)
{
return NULL;
}

hMainDC = ::GetDC(NULL);
hMemDC1 = ::CreateCompatibleDC(hMainDC);
hMemDC2 = ::CreateCompatibleDC(hMainDC);
if (hMainDC == NULL || hMemDC1 == NULL || hMemDC2 == NULL)
{
return NULL;
}

if (::GetObject(csII.hbmColor, sizeof(BITMAP), &bmp))
{
DWORD dwWidth = csII.xHotspot*2;
DWORD dwHeight = csII.yHotspot*2;

csGrayII.hbmColor = ::CreateBitmap(dwWidth, dwHeight, bmp.bmPlanes, bmp.bmBitsPixel, NULL);
if (csGrayII.hbmColor)
{
hOldBmp1 = (HBITMAP)::SelectObject(hMemDC1, csII.hbmColor);
hOldBmp2 = (HBITMAP)::SelectObject(hMemDC2, csGrayII.hbmColor);

//::BitBlt(hMemDC2, 0, 0, dwWidth, dwHeight, hMemDC1, 0, 0, SRCCOPY);

DWORD dwLoopY = 0, dwLoopX = 0;
COLORREF crPixel = 0;
BYTE byNewPixel = 0;

for (dwLoopY = 0; dwLoopY < dwHeight; dwLoopY++)
{
for (dwLoopX = 0; dwLoopX < dwWidth; dwLoopX++)
{
crPixel = ::GetPixel(hMemDC1, dwLoopX, dwLoopY);

byNewPixel = (BYTE)((GetRValue(crPixel) * 0.299) + (GetGValue(crPixel) * 0.587) + (GetBValue(crPixel) * 0.114));
if (crPixel)
{
SetPixel(hMemDC2, dwLoopX, dwLoopY, RGB(byNewPixel, byNewPixel, byNewPixel));
}
}
}
::SelectObject(hMemDC1, hOldBmp1);
::SelectObject(hMemDC2, hOldBmp2);

csGrayII.hbmMask = csII.hbmMask;

csGrayII.fIcon = TRUE;
hGrayIcon = ::CreateIconIndirect(&csGrayII);
}
::DeleteObject(csGrayII.hbmColor);
//::DeleteObject(csGrayII.hbmMask);
}
::DeleteObject(csII.hbmColor);
::DeleteObject(csII.hbmMask);
::DeleteDC(hMemDC1);
::DeleteDC(hMemDC2);
::ReleaseDC(NULL, hMainDC);

return hGrayIcon;
}
//测试代码
m_hColorIcon = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE (IDI_NOTEBOOK),IMAGE_ICON, 0, 0, 0);
m_hGrayIcon = CreateGrayscaleIcon(m_hColorIcon);
Roy_ly 2009-06-05
  • 打赏
  • 举报
回复
参考这里的方法:
http://www.codesky.net/article/doc/200309/200309128919624.htm
  • 打赏
  • 举报
回复
2楼,非常感谢,我到msdn上查一下这个函数。
cytlyy 2009-06-05
  • 打赏
  • 举报
回复
参考CreateIconIndirect 以及ICONINFO结构体。也许可以实现。
ppc_2008 2009-06-05
  • 打赏
  • 举报
回复
帮你顶

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧