OpenCV/미분류

리눅스 프레임버퍼 예제 1

webnautes 2015. 1. 27. 10:27
반응형

  콘솔에서 프레임버퍼에 색깔을 찍어본 예제입니다. X윈도우상에서도 결과를 보고 싶은데 안되네요.


 

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.     
  5. #include <fcntl.h>  
  6. #include <unistd.h>  
  7. #include <linux/fb.h>  
  8. #include <sys/mman.h>  
  9.     
  10.     
  11. int main( int argc, char* argv[] )  
  12. {  
  13.     int framebuffer_fd = 0;  
  14.     struct fb_var_screeninfo framebuffer_variable_screeninfo;  
  15.     struct fb_fix_screeninfo framebuffer_fixed_screeninfo;  
  16.     
  17.     framebuffer_fd = open( "/dev/fb0", O_RDWR );  
  18.     if ( framebuffer_fd <  0 ){  
  19.         perror( "Error: cannot open framebuffer device\n" );  
  20.         exit(1);  
  21.     }  
  22.     
  23.     
  24.     if ( ioctl(framebuffer_fd, FBIOGET_VSCREENINFO,   
  25.             &framebuffer_variable_screeninfo) )  
  26.     {  
  27.         perror( "Error: reading variable screen infomation\n" );  
  28.         exit(1);  
  29.     }  
  30.     framebuffer_variable_screeninfo.bits_per_pixel=32;  
  31.     
  32.     if ( ioctl(framebuffer_fd, FBIOPUT_VSCREENINFO,   
  33.             &framebuffer_variable_screeninfo) )  
  34.     {  
  35.         perror( "Error: reading variable screen infomation\n" );  
  36.         exit(1);  
  37.     }  
  38.     
  39.     
  40.     
  41.     if ( ioctl(framebuffer_fd, FBIOGET_FSCREENINFO,   
  42.             &framebuffer_fixed_screeninfo) )  
  43.     {  
  44.         perror( "Error: reading fixed screen infomation\n" );  
  45.         exit(1);  
  46.     }  
  47.     
  48.     printf( "framebuffer Display information\n" );  
  49.     printf( " %d x %d  %d bpp\n", framebuffer_variable_screeninfo.xres,  
  50.              framebuffer_variable_screeninfo.yres,   
  51.              framebuffer_variable_screeninfo.bits_per_pixel );  
  52.     
  53.     
  54.     int width  = framebuffer_variable_screeninfo.xres;  
  55.     int height = framebuffer_variable_screeninfo.yres;  
  56.     int bpp = framebuffer_variable_screeninfo.bits_per_pixel/8;  
  57.     int xoffset = framebuffer_variable_screeninfo.xoffset;  
  58.     int yoffset = framebuffer_variable_screeninfo.yoffset;  
  59.     
  60.     
  61.     long int screensize = width*height*bpp;  
  62.     
  63.     
  64.     char *framebuffer_pointer = (char*)mmap( 0, screensize,  
  65.                                         PROT_READ|PROT_WRITE,  
  66.                                         MAP_SHARED,  
  67.                                         framebuffer_fd, 0 );  
  68.     
  69.     if ( framebuffer_pointer == MAP_FAILED )  
  70.     {  
  71.         perror( "Error : mmap\n" );  
  72.         exit(1);  
  73.     }  
  74.     else  
  75.         {  
  76.             int x,y;  
  77.             for ( y=0; y<height; y++)  
  78.             for ( x=0; x<width; x++)  
  79.             {  
  80.                 unsigned int pixel_offset = (y+yoffset)*framebuffer_fixed_screeninfo.line_length*2 +(x+xoffset)*bpp;  
  81.         
  82.     
  83.         if (bpp==4){  
  84.             if ( x<=width*1/3){    
  85.                  framebuffer_pointer[pixel_offset]=255;//B  
  86.                  framebuffer_pointer[pixel_offset+1]=0;//G  
  87.                  framebuffer_pointer[pixel_offset+2]=0;//R  
  88.                  framebuffer_pointer[pixel_offset+3]=0;//A  
  89.             }  
  90.             if ( x>width*1/3 && x<=width*2/3){      
  91.                  framebuffer_pointer[pixel_offset]=0;//B  
  92.                  framebuffer_pointer[pixel_offset+1]=255;//G  
  93.                  framebuffer_pointer[pixel_offset+2]=0;//R  
  94.                  framebuffer_pointer[pixel_offset+3]=0;//A  
  95.             }  
  96.             if ( x>width*2/3){     
  97.                  framebuffer_pointer[pixel_offset]=0;//B  
  98.                  framebuffer_pointer[pixel_offset+1]=0;//G  
  99.                  framebuffer_pointer[pixel_offset+2]=255;//R  
  100.                  framebuffer_pointer[pixel_offset+3]=0;//A  
  101.             }  
  102.         }  
  103.     
  104.          }  
  105.     
  106.     }   
  107.     
  108.     munmap( framebuffer_pointer, screensize );   
  109.     close( framebuffer_fd );  
  110. }  
  111.     
  112.     
  113.     
  114.         


반응형

천천히 하지만 꾸준히 공부한 내용을 블로그에 공유하는 것이 제 취미생활입니다.
블로그를 시작하게 된 계기는 내가 알게된 내용을 정리하려고 였는데 이왕이면 다른 사람에게도 공유하자였지요.

다루어 주었으면 하는 분야나 궁금한 점이 있으면 댓글로 남겨주세요. 최대한 노력해볼게요.

블로그 내용을 진행해보다가 문제 발생시 지나치지 말고 댓글로 알려주세요. 그래야 다음에 해당 글을 읽는 분에게 도움이 됩니다.

해본 결과를 바탕으로 포스트를 작성하지만 시간이 경과하면
똑같이해도 동작안할 수 있습니다.



글이 많이 유익하셨다면 토스아이디로 후원해주세요. 토스아이디



제가 쓴 책도 한번 검토해보세요 ^^