研究mgaview的源码的成果

最近几天没事就看mgaview的源码,看了几遍之后,发现它的主要工作原理比较简单,大致如下:

开始


打开图片文件


读取文件头


判断图片类型


使用相应的函数解码图片为数组


调用相应的函数将数组写入至屏幕


结束




源码文件不怎么多,也不是很复杂,并且,它的源码还分类别存放在不同的文件夹:
src/
src/input
src/output

mgaview的主程序源码当然就在src目录,h格式的文件只是声明了一些全局变量,还定义了一些宏。

input目录

该目录里的源码,是用于解码各种格式的图片文件,看文件名字就知道它具体是针对哪个格式的文件了,解码后,会得到以下数据:
图片的尺寸
图片的位深度
还会得到三个 位数组:
一个是存储每个像素点显示的红色(Red)的值
一个是存储每个像素点显示的绿色(Green)的值
一个是存储每个像素点显示的蓝色(Blue)的值
图片的尺寸决定这三个数组的长度。
只需要红色绿色蓝色这三种颜色就可以组合成任何颜色,学过初中物理的同学应该有印象。
可以参考这张截图:

如图所示,当红色为255,绿色和蓝色都为0的时候,这时的颜色是纯红色。
由此可知,当红、绿、蓝都为255的时候,会变成白色,0到255,颜色从深到浅。
那么,在学习机屏幕上画一张全屏白色的图就很容易了,只需要将三个数组全部赋值为255,并传给mgaview的相应函数既可显示。


C语言代码演示
unsigned char image_r[2]={255,255};
unsigned char image_g[2]={255,255};
unsigned char image_b[2]={255,255};
这三段代码表示的是两个像素点显示的颜色,内容都为255,也就是两个像素点都显示为白色。
每个颜色都有256种亮度,这样算来,每个像素点一共可以显示256*256*256=16777216种颜色,学习机的屏幕支持26万色,而这1600万色好像无法真正能完全显示。

由以上可以联想到:
我的学习机的屏幕的分辨率是320X240
320*240=76800个像素点
每个像素点由三个数组中对应的元素表示
而每个元素的长度都为1
76800*3*1=230400
之后
230400/1024=225KB
一张320*240的bmp图片,它的大小为225KB(忽略文件头信息,它会占一些空间),因为bmp是位图,如果你看到一张图片的大小恰好是225KB,那么,它可能就是bmp图片或者这种格式的图片是直接保存像素点数据的。
当然,这是针对于没有调色板的24位的BMP,24位的bmp是直接使用RGB,而有调色板的bmp,体积可能不会是225KB,它使用调色板中颜色索引值。

关于bmp图片,可以看百科词条:http://baike.baidu.com/view/7671.htm


output目录
顾名思义,output,输出,也就是显示的意思,将位数组显示到屏幕上,你可以看看里面的源码文件的内容,只有几个C源码文件和头文件;
其中mga_vfb.c里有个关键函数,它的原型是:void write_to_fb(uint8_t *r,uint8_t *g,uint8_t *b)
write_to_fb?写入至设备fb?fb就是framebuffer。
里面的r,g,b这三个指针就是指向传入的三个数组(解释可能不专业),这三个数组分别是表示每个像素点的绿三种颜色的深度,还有全局变量,所有函数共用的,并不是只传三个数组就可以了,全局变量中还有表示图片的宽度和高度的量。
其他的函数,看了一下,是处理图片缩放、旋转之类的函数,也就是修改数组的内容罢了。

博主设置当前文章不允许评论。

没有更多推荐了,返回首页