这几天在忙着往appsboot下移植了lcd的驱动,想自己修改显示的图片,本想在网上搜一下转换程序的,但搜了一些都不好用,索性自己写了一个.
说明一下,rgb24的图片文件的格式是B,G,R,的,也就是说,一个像素,首先是一个字节的Blue,再是一个字节的Green,最后是一个字节的Red.然后因为rgb24的文件中没有颜色表选项,所以程序中把颜色表给省掉了.
为做成能在appsboot中显示的数据,也要了解一下appsboot中的565的格式
格式如下:
第一个字节:G2,G1,G0,B4,B3,B2,B1,B0,
第二个字节:R4,R3,R2,R1,R0,G5,G4,G3,
如果这个字节的顺序不对,显示的效果会很差的.
我的目标就是用程序读一个bmp24位的文件,然后生成一个文件,文件中为rgb565的数据,生成的格式如下:
0xff0xd6,0x780xb5,0x530xac,0xd10x6a,0x670x51,0xa3,
0xff0xd6,0x780xb5,0x530xac,0xd10x6a,0x670x51,0xa3
0xff0xd6,0x780xb5,0x530xac,0xd10x6a,0x670x51,0xa3
像这样的数据就可以直接放在appsboot中的数组中用来显示了.
下面是程序,好久没有写c程序了,好几个函数都不知道怎么用了,把相关几个函数的用法也顺便发一下:
1.
fread返回的不是字节数,当且仅当下面这么用的时候,返回值才是字节数
char buff[size];
FILE *fp;
...
fread(buff, 1, size, fp);
...
如果是: fread(buff, size, 1, fp)
返回1表示读取了size字节,返回0表示读取数量不够size字节,究竟是多少不知道!!-----------------确实是这样的!
fread 的作用是按定长记录读取文件,返回的是记录数。
from http://blog.youkuaiyun.com/jlnhyd/archive/2009/06/04/4242783.aspx
2.
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
3.bmp文件的格式和相关结构体可在这里找到:
http://blog.youkuaiyun.com/dawn81/archive/2006/02/09/595131.aspx
4.rgb24和rgb565的转换在这里可以找到:
http://blog.youkuaiyun.com/anufa/archive/2007/03/14/1529484.aspx
但转换时还是要详细了解清楚.
程序如下:
#include <unistd.h>
#includ