该文章内容已经重新整理,建议访问以下链接以提升阅读体验:

https://blog.lc-soft.io/posts/c-lang-learning.html

开始向程序的图形界面化进军!

在编写文件管理器的过程中,偶尔做些别的,因为代码写多了,会感到枯燥无味,没有动力,想做其它事情,于是,我就去研究mgaview的源码,因为它能显示图形,想知道它的原理,这个是研究后成果:http://blog.csdn.net/liuchao35758600/article/details/6789910,在此不做过多说明。

研究mgaview的源码的收获还是很大的,了解了linux下显示图形的方法,mgaview是通过往framebuffer(帧缓冲)写数据而实现图形显示的,具体内容不多说,可以参考那文章。

研究后,我就尝试了一下,将屏幕填充白色,之后,在自定的位置显示一个红色矩形,结果成功了,我又改了一下代码,让这个红色矩形在白色背景中移动;

在这之后,我将红色矩形改成了小鸟,小鸟的图片数组是用mgaview中的图片解码功能解码出来的,第一次测试,小鸟的图片变形了,后来发现其实是图片尺寸有问题,不是实际尺寸,纠正后能正常显示,我增加了1只小鸟,又把白色背景改成一半黑一半白的:

图片可以在程序里内置,只需要转换成图片数组即可。

你可以将屏幕看成一个坐标系,左上角是原点(0,0),由于这些图形数据是线性存储的,将二维坐标转换成一维的线性坐标的公式为:

数组中的位置 = y轴坐标 * 屏幕宽度 + x轴坐标

例如:屏幕上有个点的坐标为(320, 240),而屏幕尺寸是宽为1280像素,高为800像素,那么,这个点在数组中的位置是:240 * 1280 + 320 = 307520;

屏幕每个像素点表示的颜色都保存在一个数组中,每隔3个元素表示一个像素点的颜色,因为分别是表示Red、Green、Blue这三色的深度的,但一般是每隔4个元素,貌似多出来的是alpha通道,也就是透明度,因此,需要乘以4,才能得到真正的位置:(240 * 1280 + 320)*4 = 1 230 080;

假设指向framebuffer内存地址的指针是p_fb,那么,p_fb[1230080]是这个像素点的Red颜色深度,p_fb[1230081]是Green颜色深度,p_fb[1230082]是Blue颜色深度。

我的学习机里的像素点的颜色排列顺序是BGR,不是RGB,要显示正确的颜色,就要改变一下RGB的写入顺序,否则,显示出来的颜色不对。

掌握了这个知识,我用了彩色背景、一个人的图像素材,这个图像素材是我用手机截取的,运行游戏,之后截图,把动画分解成多个图片,之后用PS将人物动作图形抠出来,保存为png,将这些图片转换成数组,每张图一共四个数组,分别保存R、G、B、A通道,关于用alpha通道混合图形的方法,我发了个帖子:http://topic.csdn.net/u/20110623/14/ac5fbbff-a3f9-469f-a362-ecde8aa32a3f.html

用了回帖者告诉我的公式,成功的实现了用alpha通道混合图形,最终,做了个测试程序:

可用按键控制这个人行走,按J键使用攻击动作。

人物的图形素材,来自这个游戏:

我将我从mgaview源码中获得的知识,应用到了文件管理器,使之实现了半图形化界面,主界面是第一个实现图形化的:

第一张图是初始的样子,过了不久,我又改了一下,界面下面一排显示内存信息,并且会动态更新数据,这些文字是用ps做的,数字0-9,小数点、MB、GB、KB分别保存至png图片中,包含alpha通道,其余直接写个完整的文本保存至png图片。文字的显示,我通过判断字符串的内容,来生成对应的图形,之后,粘贴至指定的位置,例如:59.16

MB,遍历这个字符串,计算所需矩形背景的长度和宽度,之后判断,第一个是5,那么,用5的位图,贴到矩形背景中,第二个是9,那么,用9的的位图,贴到矩形背景中,就这样,以此类推,最终,矩形背景中就贴上了该字符串对应的位图。

容量条的显示,我准备了三张图片,红色、蓝色的满格容量条的图片,一张容量条的空槽的图片,根据百分比的值,将适合长度的满格容量条贴到空槽的图片中,超过一定值时,就用红色的容量条的图片,这个方法是那个时候想到的,当然,现在如果再来做的话,就用这种方法:准备1个像素点宽度的红蓝容量条,空槽可以用算法画,之后,根据百分比的值,画长度为 (总长度x百分比) 的容量条至空槽中。

在这之后,其它的功能也实现了图形化:

按钮是模拟实现的,虽然按下时有凹陷的效果,但都是用图片贴出来的;“窗口”中的内容,大部分是用PS预先编辑好的,剩下的由程序处理显示。

以上讲的是文件管理器的主要功能,其它细节功能就没有做过多的说明。

图形处理,使用的算法是个人经过思考和多次测试完善得出来的,比如:图形的截取,图形的合成,这些“算法”都很简单,不知道称之为“算法”是否合适。

小结

研究了mgaview程序的源代码,初步掌握了如何利用图形库提供的函数实现相应格式的图片文件的解码,bmp图片可以直接读,不需要其它图形库的支持。

初步掌握了图形数据的处理,实现了简单的图形合成,图形裁剪。

我的C语言学习历程:图形篇相关推荐

  1. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  2. C语言学习历程--小项目篇(1)

    C语言学习历程–小项目篇–基于winpcap的UDP数据发送 开发环境介绍 1.操作系统:windows10(基于x64处理器).IDE:vs 2019(微软官网个人免费版).winpcap安装包及开 ...

  3. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  4. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

  5. python学习历程-安装篇(一)

    python学习历程-安装篇 之前工作中数据量很少,每天也就是用excel发一下报表,函数已经足够应付工作内容,但心里一直渴望学习更深层次一点的数据分析(崇拜那些技术大神),网上看了很多有关数据分析挖 ...

  6. C语言学习历程——C语言发展史以及--Hello World 程序

    C语言之父 丹尼斯·麦卡利斯泰尔·里奇(英语:Dennis MacAlistair Ritchie,1941年9月9日-2011年10月12日),美国计算机科学家,他是C语言的创造者.Unix操作系统 ...

  7. 每天学习八小时以下是不道德的(牛人的语言学习历程)--转

    我在北美读书,不断有小朋友问我学习和申请的事情,不回答不好,回答吧,又好像我有意教人似的.经验教训谈这种东西最不靠谱,别人的事情,也就是看个热闹,该自己奋斗的还是自己奋斗.我终于写了这一篇,写得很费力 ...

  8. 易语言学习笔记——基础篇

    易语言学习笔记20180710 一. 易语言的数据类型可以分为基本数据类型和特殊数据类型 1.     其中基本数据类型分为: ①   数值型 ②   逻辑型 ③   日期时间型 ④   文本型 ⑤  ...

  9. 易语言学习笔记——命令篇

    易语言学习笔记20180711 一. 命令概述 1.     什么是命令:命令是一个功能调用的开始. 2.     命令的参数:调用一个功能方法时候输入的数据或者条件. 3.     命令的返回值:调 ...

  10. 易语言学习笔记——入门篇

    易语言学习笔记20180709 最早接触易语言是三年前的事情了,那时候是因为DNF这个游戏我才知道了易语言这个编程语言,当时对他就非常的憧憬.只不过那时候易语言的学习资源比较少,而且自身的学业比较重就 ...

最新文章

  1. [Android]生成heap dump文件(.hprof)
  2. 关于 htonl 和 ntohl 的实现
  3. nstruts2.0发布前奏---浅谈struts和依赖注入在项目中的应用
  4. ThreadLocal管理Connection
  5. NOIP模拟测试13「矩阵游戏·跳房子·优美序列」
  6. Repository 返回 IQueryable?还是 IEnumerable?
  7. sftp 设置仅能访问自己目录的用户
  8. pygame系列文章
  9. Objective-C中内存管理的一些特例
  10. 用Eclipse的TaskList功能进行任务管理(提高工作效率)
  11. html文本域 高度自适应,Javascript 文本域根据输入内容自适应高度
  12. 跟着清风学建模——拟合算法介绍及mathlab代码实现
  13. Seaweedfs的安装和使用--研究
  14. linux禁止root用户su,Linux 禁止普通用户su到root
  15. java有符号和无符号右移
  16. debian 9 配置ati驱动
  17. 阜城中学2021高考成绩查询,河北省衡水市阜城中学2020-2021学年高二上学期开学考试英语试题...
  18. 解决PCB焊盘堵,PCB通孔的方法(个人总结)
  19. 竞争情报分析工具Alexa
  20. 智能/傻瓜交换机、光纤交换机、普通交换机的区别

热门文章

  1. 数据库十二星座 之 射手座的闪电
  2. 【Laravel3.0.0源码阅读分析】sweeper接口sweeper.php
  3. 粉笔公考——错题集——行测(浙江)
  4. 完美解决,ESP32在arduino IDE下串口不断输出rst:0x10 (RTCWDT_RTC_RESET),boot:0x13(SPI_FAST_FLASH_BOOT)
  5. iOS开发 - 第04篇 - 网络 - 02 - JSON解析 请求 黑酷例子 HTTP通信
  6. studio one 5|preSonus studio one pro 5(音乐制作软件) v5.1.0
  7. 音乐制作宿主软件-PreSonus Studio One 5 Professional v5.2.0 WiN
  8. Wechaty | NodeJS基于wechaty-puppet-hostie协议手撸一个企业级微信机器人助手
  9. labview运行excel宏_【2017年整理】LabVIEW中Excel报告生成功能开发.pdf
  10. 【整理】HUVEC、NIH3T3、H9C2、HaCaT、BXPC-3等细胞株培养时注意事项