【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
除了图形方面的应用之外,easyx还可以用来处理图像,也是非常方便的。大家处理图像的收,一般会使用opencv,毕竟opencv是专业的图像处理库。但是如果项目本身不大的话,其实也可以用easyx处理一下基本的图像算法,这也是可以的。尤其是快速做demo的时候,easyx的优势特别大。
1、准备好lena.png图像
lena图像下载的方式很多,直接wikipedia下载就是一种处理方式。
2、使用loadimage函数直接加载图片
loadimage函数是库里面自带的函数,加载好之后就可以直接显示了。显示的位置就是从窗口0、0处开始的位置。
int main()
{
initgraph(500, 500);
::loadimage(NULL, _T("./lena.png"));
_getch(); // press any key to quit
closegraph();
}
整个代码还非常简单的,只需要一个loadimage函数即可。其他部分的内容,都是和之前一样,初始化一下窗口就行。
3、把图片设置成灰度图
为了处理图像,我们尝试把图片设置成灰度图。灰度图的公式,还是比较简单的,我们直接使用下面这个公式即可,
Gray = R*0.299 + G*0.587 + B*0.114
有了公式之后,接下来要做的,就是寻找到像素的buffer即可。正好本身easyx提供了这样二到一个库函数,即GetImageBuffer,所以整个灰度图的计算就可以了,
#include <graphics.h>
#include <conio.h>
void transformeToGrayImg()
{
DWORD* pMem = ::GetImageBuffer();
unsigned char gray = 0;
for (int i = 0; i < 500 * 500; i++)
{
gray = (unsigned char)(((unsigned char*)(&pMem[i]))[0] * 0.114 + ((unsigned char*)(&pMem[i]))[1] * 0.587 + ((unsigned char*)(&pMem[i]))[2] * 0.299);
pMem[i] = BGR(RGB(gray,gray, gray));
}
FlushBatchDraw();
}
最后要做的,就是把这个函数加入到main函数主流程当中,
int main()
{
initgraph(500, 500);
::loadimage(NULL, _T("./lena.png"));
transformeToGrayImg();
_getch(); // press any key to quit
closegraph();
}
不出意外的话,我们就可以看到这样的效果图。
4、其它也可以用easyx做的工作
不仅仅是图像处理,我们还可以用easyx做很多其他的工作。比如说底层嵌入式的开发,尤其是图形界面。大家都知道,很多的底层界面都是用类似ucgui开发的,但是这部分工作,如果每次都是port到开发板开发,效率很低。而easyx本身提供了很多lowlevel api,所以可以底层适配一下ucgui,这样就可以用visual studio开发ucgui界面程序,效率会高很多。
补充:
1)实际开发中,也有可能使用到鼠标,就可以通过下面这种方式获取信息,
void processInput()
{
ExMessage msg;
while (peekmessage(&msg, EM_MOUSE | EM_KEY))
{
if (WM_MOUSEMOVE == msg.message && msg.lbutton)
{
// add code here
int x = msg.x;
int y = msg.y;
}
else if (WM_RBUTTONDOWN == msg.message && msg.rbutton)
{
// add code here
}
else if (WM_KEYDOWN == msg.message && msg.vkcode == VK_SPACE)
{
// add code here
}
}
}
2)如果是窗口输入数据,就是这种方式,
char s[10] = {0};
InputBox(s, 10, "Input data:");