我的程序员之路(3)——学生时代(3)
我的大学——入行期(2)
2009年6年,导师要我做一个照相的程序。借来了相机,佳能的,于是先从相机的API入手,研究程序对相机的操作,都是一些英文资料,还得备好驱动,很是麻烦。慢慢对相机操作熟悉了,再根据习惯对API进行相应的封装,这提高可不少。照相的程序做好了,新的要求就出来了,要求可以自动将相片处理成公安部确定的尺寸,358*441像素,头顶到相片顶端的距离14-21等等,好的是公司以前开发过这个功能,直接拿到动态库就可以使用。不过没那么容易,如果接口设计成传入原始相片返回标准照片就好了,可实际上不可能这么设计,传入照片数据及照片尺寸,返回剪切位置及剪切尺寸,然后要根据这些信息从原始照片上剪切出来并缩小到标准尺寸,剪切位置还不是起点坐标,总之很是麻烦,研究了很长时间,以至于刚开始我还以为这个动态库根本实现不了这个功能。期间研究CBitmap,位数、数据对齐等,提取位图数据修改再重设位图,研究.bmp数据格式,封装类用于读写.bmp图片文件,学到了不少东西。还有图像处理方面的理论与算法,比如图像几何变换、灰度变换、平滑处理、图像锐化、边缘提取等好多算法,jpg格式的算法(不过现在还不会做自己的格式转换,傅立叶变换什么的,都是这个时候学的),gif和png格式,所以压缩算法也接触了点。这段时间学的很我图像处理方面的知识,现在工作中都用上了,比如用GDI+处理的图像,发现速度太慢,应用受到影响,只能用GDI手动处理图像来提高速度,再不行就得代码操作图像数据,然后生成图像显示到窗口了,计算机图形学上那个直线生成算法什么的,就在这里用了。
学图像处理理论,对毕业论文有很大帮助。我的毕业论文是《基于密度的聚类算法研究》,是将灰度阈值分割理论用在了聚类算法上,DBSCAN算法,只能处理密度相关较大的数据,而且聚类前要输入参数,先用阈值分割理论对数据的密度进行一下分类,再用DBSCAN算法聚类就提高了聚类效果,这个我也用代码实现了,而且效果与理论上的效果很接近,收获很多。
可以从相机采集到照片了,也会图像处理了,下一步就是软件设计了。先是将两个功能设计在一块,同事说这样设计不合理,应该要按功能模块分开,所以又分成两个主程序,一是人像采集,一是人像处理,两个程序间可以切换。图像处理时的功能相对多些,所以要设计工具栏、浮动工具栏什么的,学会了不少东西。导师看到设计成这样,也说界面太难看,要加入美工。加美工得先总结对话框,对每个对话框设计窗体,所以另个组的项目经理帮忙总结,这样,又设计了一款多个对话框的系统。帮完这些也该过新年了,新年后继续设计。美工说这么设计不好,所以跟美工交流,美工想办法设计,又将多个功能做成选项卡形式的,界面的设计我听美工的。美工设计好整体外观图,我再把图片按各个元素剪下来以在软件中使用。既然有美工,就得考虑换皮肤的问题。网上查了些资料,皮肤包有现成的包。别人的东西总不如自己设计的方便,网上的皮肤包只能把所有对话框成一种样式,不能一个对话框一个样式,没法在自己的软件中使用。于是考虑皮肤的设计问题,而且最重要的是,接口要设计的很容易使用,最好一句调用包整个软件的皮肤都换掉。千辛万苦,终于设计出来了,现在是把所有皮肤元素都放在一个文件夹下,那如果用户不小心删掉了一个图片文件,这会影响到软件的,所以要把皮肤包打包,意味着要把一个文件夹下的所有文件夹及文件打包成一个文件,而且根据这个文件还能还原成文件夹及文件,实现这个功能学习又进步不少,现在的工作中也用到这些知识了。程序运行起来,根据皮肤包文件还原为文件夹形式的皮肤包,这有个问题,公司美工做的图片会泄露啊,要保护自己公司的劳动成果吧,所以要让程序在内存中解包。皮肤包完了还有语言包,当然皮肤包的问题解决了,语言包的问题也能解决,这个是一样的,只是要用语言包,就要为每一个显示文字的地方编号,切换语言时要根据编号显示相应的文本。美工的提议,窗口边缘最好做成半透明的,选项卡形式的子窗口半透明没问题,背景图片处理好就能实现,要显示在桌面上的半透明效果就麻烦了,要有相应的动态库支持,而且窗体半透明时窗体上的控件是显示不出来的。为了解决这个问题,查了不少资料,最后是做成了两层,半透明窗体是一个对话框,控件是另一个对话框,窗体移动时两个对话框要同时移动。皮肤包语言包也会受到影响,因为半透明的窗体只能根据图片生成,而窗体标题上的文本要可切换,窗体背景图片也可切换,所以软件的设计上又费了一番工夫。不管难度有多大,最后所以问题都解决了,做成了一个完整的奖品,完成作品时,就到毕业时候了。长春离家太远了,所以毕业后我来到了北京,来这里见见世面,因为找到一个像我一样热爱写程序的太少了。
以上这些都是在公司实习时做的,由于我很爱好写代码,所以也有自己的爱好,这期间,也帮同学写过一些程序,比如2009年7月8月,帮同学做过个歌唱比赛的评分系统。这个要有客户端服务器,由于写过聊天软件,所以写起这个来也很顺手。但要解决的问题也很多,比如客户端网线掉了又连上怎么办,总不能让服务器重启吧,而且客户端网线掉了服务器要知道该客户端掉线了,毕竟评委都是电脑盲,他们可能压根不知道他已经掉线了。一个小组的评分完成要生成结果,结果是要生成图片的,这样就可以直接显示在大屏幕上了,不然就得现做Word表格了,再说时间也不允许啊,评分结果要很快显示在大屏幕上的;还有另一个要求,就是一个选手唱完歌,下一个选手上台前就要出结果,唉,幸亏是电脑计分,不然可做不到。
想到什么程序,我也会去实现的,比如外挂,QQ俄罗斯方块、QQ连连看、QQ找茬、QQ扫地雷等小游戏的外挂。写的最好的就是QQ连连看外挂了,点一下按钮就会消一对,或者点一下按钮全消光光,C#写过,C++也写,用C#时只能模拟鼠标或键盘给窗体发送消息,但这样必须是游戏窗口有焦点;C++写就可以给窗体发送消息了,很方便,不过QQ俄罗斯的键盘消息不好使,研究了很长时间也不知道腾讯的火拼俄罗斯怎么处理的键盘消息。当然,写游戏外挂也不是一帆风顺,刚开始的外挂是获取屏幕颜色来处理的,后来会遍历窗口了就通过遍历窗口来找到游戏窗口,再获取游戏窗口上的相应区域的图片,根据图片上的颜色值处理数据计算需要什么样的操作,通过发送消息操作游戏。这些是很机械的外挂,像农场种地那种游戏的外挂,就不知道如何下手了;来到北京的确学会了不少东西,至少会应用程序与Web服务器的通信了,所以就可以写农场种菜游戏的外挂了,有WebQQ也可以做个可以与腾讯的QQ聊天的程序了,或者做个聊天机器人,不过这些都是毕业后学会的了。
学生时代结束了,但我还要在程序员这条路上继续走下去。
作者:yjh4866