绘制bmp类型的图片:
步骤:1.用open打开图片文件,用lseek偏移54个字节(),将其读入指针,指针大小为图片长乘宽乘像素深度除以一个字节的大小(8字节)。
2.从尾部开始读取(bmp的特性),从左到右,循环从指针中读取rgb值,一次读取3个8位二进制值作为b、g、r的值,读取后,对r值左移16位,g值左移8位,b值移动0位(RBG888),或对r值右移3位再左移11位,g值右移2位再左移5位,b值移动3位(RBG565),然后相或。或出的结果作为绘制点的颜色打印即可。
int draw_bmp(char *bmp,int w,int h)
{
int fd=open(bmp,O_RDONLY);
lseek(fd,54,SEEK_SET);
unsigned char *pic=malloc(w*h*24/8);
read(fd,pic,w*h*24/8);
unsigned char *p=pic;
for(int i=h-1;i>=0;i--)
{
for(int j=0;j<w;j++)
{
unsigned char r,g,b;
b=*p;p++;
g=*p;p++;
r=*p;p++;
if(fb1.bit==32)
{
unsigned int col=r<<16|g<<8|b<<0;
point(j,i,col);
}
else if(fb1.bit==16)
{
unsigned short col=(r>>3)<<11|(g>>2)<<5|(b>>3);
point(j,i,col);
}
}
}
绘制汉字:
步骤:1.用字模软件生成字的代码,并用数组储存代码。
2.确定字符的坐标,以及字符的大小
3.按照先高后宽的原则循环打印字符块(数组)中的代码串(使用打印点的方法)---两个循环,一个高,一个宽。
4.打印时,需再加一个循环遍历字符块的行数像素点(0~8),并使像素点的代码与0x80相与,判断其为字符体还是字符背景。
void draw_gb2312(int x,int y,unsigned char *yan,int high,int len) //x,y为坐标,yan为字符代码数组,high与len为字符块大小
{
int i,j,k;
unsigned char temp;
for(i=0;i<high;i++)
{
for(k=0;k<len;k++)
{
temp=yan[i*len+k];
for(j=0;j<8;j++)
{
if(temp&0x80)
{
point(8*k+x+j,y+i,0x00FFFF00);
}
temp=temp<<1;
}
}
}
}