Easyx使用(下篇)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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:");

### EasyX 图形库输入功能介绍 EasyX 是一款专为 C++ 设计的轻量级图形库,能够简化图形界面和游戏开发过程。对于输入操作的支持也是该库的重要特性之一。 #### 键盘事件处理 为了捕获键盘按键动作,在程序中可以通过 `GetKeyState` 函数获取当前键的状态[^2]。此函数返回指定虚拟键的状态信息,可用于判断特定键是否被按下。另外,还可以利用 `_kbhit()` 来检测是否有未读取的字符等待输入,并配合 `getch()` 或者 `getche()` 获取实际按下的键值[^4]。 ```cpp #include <graphics.h> #include <conio.h> int main() { initgraph(600, 400); // 初始化窗口大小 while (true) { if (_kbhit()) { // 如果有按键事件发生 char key = getch(); // 读取按键 switch(key){ case 'q': // 当用户按下 q 键退出循环 break; default: printf("You pressed %c\n", key); } if (key == 'q') break; // 用户选择退出则跳出循环 } Sleep(100); // 防止 CPU 占用过高 } closegraph(); } ``` #### 鼠标事件监听 除了键盘外,鼠标交互同样重要。EasyX 提供了专门用于捕捉鼠标的 API 接口,如 `MouseMsg GetMouseMsg(void)` 可以用来接收最新的鼠标消息队列中的数据包。这些消息包含了位置坐标以及按钮状态等细节,允许开发者创建响应式的 GUI 应用程序。 ```cpp #include <graphics.h> void onMouse(int event, int x, int y, unsigned keys) { settextcolor(WHITE); switch(event){ case MBUTTON_DOWN://当鼠标左键点击时触发 circle(x,y,50); // 绘制圆圈表示点击的位置 outtextxy(x+8,y,"Click"); break; case MWHEEL_UP://滚轮向上滚动 ellipse(x-30,y-30,x+30,y+30);//绘制椭圆形代表放大效果 outtextxy(x+8,y,"Zoom In"); break; case MWHEEL_DOWN://滚轮向下滚动 rectangle(x-30,y-30,x+30,y+30); //矩形表示缩小效果 outtextxy(x+8,y,"Zoom Out"); break; default: return ; } } int main(){ initwindow(600, 400); registermousehandler(onMouse); getchar(); closegraph(); } ``` 通过上述方法,可以有效地实现对用户的输入反馈机制,无论是来自键盘还是鼠标的指令都能得到及时而准确地解析与回应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式-老费

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值