使用framebuff技术绘制图片与汉字

绘制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;
             }
        }
    }
}

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值