看了七十一雾央的博客后深有感触,决定学习一下,跟着操作,写下自己的心得。
初体验。
2015/06/14/
///by xbw
编译器 visual studio 2013 MFC应用程序
贴图美化
先说一个要点,想了一下才发现,为什么要用相对路径(什么是相对路径参考本人其他文章),做好的工程最终是要发布给别人的,如果用绝对路径,
例如: F:\\images\\me.png。这样会很蛋疼,程序在别人电脑运行,就会显示文件丢失,这个图片根本找不到,这样的话,相对路径就可以了。
把要添加的图片在工程文件中的工程子文件新建一个例如images文件夹,把图片拖入,只需m_hero.Load(_T("images\\me12.png"));这样,ok了;
接下来,重点来了。
//先说说雾央老师的方法吧;
不管哪种方法,都要在CChildView.h文件中加入变量定义,public中加入 CImage m_hero;
这里呢,雾央老师为我们封装了一个函数,
void TransparentPNG(CImage *png)
{
for (int i = 0; i <png->GetWidth(); i++)
{
for (int j = 0; j <png->GetHeight(); j++)
{
unsigned char* pucColor = reinterpret_cast<unsigned char*>(png->GetPixelAddress(i, j));
pucColor[0] = pucColor[0] * pucColor[3] / 255;
pucColor[1] = pucColor[1] * pucColor[3] / 255;
pucColor[2] = pucColor[2] * pucColor[3] / 255;
}
}
}
将此段代码放在CChileView.cpp文件中。我们找到 void CChildView::OnPaint()
加入 代码
m_hero.Load(_T("images\\me12.png"));
//m_hero.SetTransparentColor(RGB(0, 0, 255));
TransparentPNG(&m_hero);
m_hero.Draw(*cDC, 200, 300, 60, 60);
这里我要说一下,雾央老师这个局限性比较大,首先,你需要用Photoshop 把图片的背景扣掉,这样才可以,加入图片为蓝色,他的十进制RGB为(0,0,255),这就比较蛋疼,雾央老师封装的函数我们可以看到都除以255了,很明显这是白色, 如果是蓝色,就要除以0;这样显然会出错的;
还有个地方,之前没运行对,就是代码顺序问题,对于初学者何难将代码插对,要先透明处理,然后再绘图,上边的代码顺序就对了;;;;;
/接下来说个简单的方法,个人觉得比较实用,真心方便,不需要ps,只需要一个//拾色器工具
其他不变,我用的是蓝色背景的图片,这次我不需要ps抠图了,用拾色器知道蓝色RGB(0,0,255),上代码
m_hero.Load(_T("images\\me.png"));
m_hero.SetTransparentColor(RGB(0, 0, 255));
//TransparentPNG(&m_hero);
m_hero.Draw(*cDC, 200, 300, 60, 60);
这样就好了,是不是很开心,就这么简单;
上完整代码片段
void CChildView::OnPaint()
{
CPaintDC dc(this); // 用于绘制的设备上下文
CDC *cDC = this->GetDC(); //获得当前窗口的DC
GetClientRect(&m_client); //获得窗口的尺寸
//加入我们要绘制的代码。。。。。。
m_bgcDC.CreateCompatibleDC(NULL);
m_bgBitmap.LoadBitmap(IDB_BITMAP1);
m_bgcDC.SelectObject(&m_bgBitmap);
cDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), &m_bgcDC, 0, 0, SRCCOPY);
m_hero.Load(_T("images\\me.png"));
m_hero.SetTransparentColor(RGB(0, 0, 255));
//TransparentPNG(&m_hero);
m_hero.Draw(*cDC, 200, 300, 60, 60);
ReleaseDC(cDC); //释放DC
// TODO: 在此处添加消息处理程序代码
// 不要为绘制消息而调用 CWnd::OnPaint()
}
本节结束,开心吧。。。。。。