• linux下的framebuffer显示图片


    void  showbmp2()
     {
         int x,y;
         unsigned char *p;
         int index=0;
         struct fb_var_screeninfo vinfo; 
         struct fb_fix_screeninfo finfo; 

         struct fb_bitfield red; 
         struct fb_bitfield green; 
         struct fb_bitfield blue; 

         //open the showdeviece
         fbfd = open("/dev/fb0", O_RDWR); 
         if (!fbfd) 
         { 
      printf("Error: cannot open framebuffer device. "); 
      exit(1); 
         } 
      
         if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) 
         { 
      printf("Error£ºreading fixed information. "); 
      exit(2); 
         } 
      
         if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) 
         { 
      printf("Error: reading variable information. "); 
      exit(3); 
         } 
      
         printf("R:%d,G:%d,B:%d ", vinfo.red, vinfo.green, vinfo.blue ); 
      
         printf("%dx%d, %dbpp ", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel ); 
         xres = vinfo.xres; 
         yres = vinfo.yres; 
         bits_per_pixel = vinfo.bits_per_pixel; 
      
         //ŒÆËãÆÁÄ»µÄ×ÜŽóС£š×֜ڣ©  
         screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel / 8; 
         printf("screensize=%d byte ",screensize); 
      
         //¶ÔÏóÓ³Éä  
         fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); 
         if ((int)fbp == -1) 
         { 
      printf("Error: failed to map framebuffer device to memory. "); 
      exit(4); 
         } 
      
         printf("sizeof file header=%d ", sizeof(BITMAPFILEHEADER)); 
      
         printf("into show_bmp function "); 
         FILE *fp[3];

      fp[0] = fopen("./333.bmp","rb+");
      fp[1] = fopen("./444.bmp","rb+");
      fp[2] = fopen("./555.bmp","rb+");

         fread(data,54,1,fp[0]);
         fread(data,WIDTH*HEIGHT*3,1,fp[0]);
         for(y=0;y<HEIGHT;y++)
         {
      for(x=0;x<WIDTH;x++)
      {
          //if(x<640)
          {
           buf[1][(((HEIGHT-1)-y)*WIDTH+x)*4 + 0] = data[((y*WIDTH) + x)*3 + 0];
              buf[1][(((HEIGHT-1)-y)*WIDTH+x)*4 + 1] = data[((y*WIDTH) + x)*3 + 1];
              buf[1][(((HEIGHT-1)-y)*WIDTH+x)*4 + 2] = data[((y*WIDTH) + x)*3 + 2];
              //buf[1][(479-y)*WIDTH+x)*4 + 3] = data[((y*640) + x)*3 + 0];
          }
      }
         }
     //
         fread(data,54,1,fp[1]);
         fread(data,WIDTH*HEIGHT*3,1,fp[1]);
         for(y=0;y<HEIGHT;y++)
         {
      for(x=0;x<WIDTH;x++)
      {
          //if(x<640)
          {
           buf[2][(((HEIGHT-1)-y)*WIDTH+x)*4 + 0] = data[((y*WIDTH) + x)*3 + 0];
              buf[2][(((HEIGHT-1)-y)*WIDTH+x)*4 + 1] = data[((y*WIDTH) + x)*3 + 1];
              buf[2][(((HEIGHT-1)-y)*WIDTH+x)*4 + 2] = data[((y*WIDTH) + x)*3 + 2];
              //buf[1][(479-y)*WIDTH+x)*4 + 3] = data[((y*640) + x)*3 + 0];
          }
      }
         }
     //
         fread(data,54,1,fp[2]);
         fread(data,WIDTH*HEIGHT*3,1,fp[2]);
         for(y=0;y<HEIGHT;y++)  
         {
      for(x=0;x<WIDTH;x++)
      {
         // if(x<640)
           {
           buf[3][(((HEIGHT-1)-y)*WIDTH+x)*4 + 0] = data[((y*WIDTH) + x)*3 + 0];
              buf[3][(((HEIGHT-1)-y)*WIDTH+x)*4 + 1] = data[((y*WIDTH) + x)*3 + 1];
              buf[3][(((HEIGHT-1)-y)*WIDTH+x)*4 + 2] = data[((y*WIDTH) + x)*3 + 2];
              //buf[1][(479-y)*WIDTH+x)*4 + 3] = data[((y*640) + x)*3 + 0];
          }
      }
         }
         fclose(fp[0]); fclose(fp[1]); fclose(fp[2]);
         //
         while(1)
         {

          memcpy(fbp,buf[index++%picindex + 1],WIDTH*HEIGHT*4);
          sleep(2);

         }   
         printf("/nover!/n");

         return ;
     }

  • 相关阅读:
    vi里面全局替换
    guanbi selinux
    ntop
    Java:求一个数组中连续子元素最大和
    LeetCode.643. 子数组最大平均数 I
    分治法-最大子数组问题
    Java实现最大连续子数组和
    golang xorm cmd xorm工具使用 reverse 反转一个数据库结构,生成代码
    golang中xorm的基本使用
    xorm入门
  • 原文地址:https://www.cnblogs.com/james1207/p/3253573.html
Copyright © 2020-2023  润新知