天天看點

/LGC圖形渲染/通過 framebuffer 擷取螢幕資訊

通過 framebuffer 擷取螢幕資訊 作者: liuuupen 日期: 2008-09-15

簡介

本文介紹了一個簡單的操作 framebuffer 的程式,它打開 /dev/fb 檔案,讀取 并列印螢幕分辨率等資訊。

程式主要流程

應用程式中,操作/dev/fb 的一般步驟總結如下:

  1. 打開/dev/fb 裝置檔案。
  2. 用 ioctrl 操作取得目前顯示螢幕的參數,如螢幕分辨率,每個像素點的比特數。根據螢幕參數可計算螢幕緩沖區的大小。
  3. 将螢幕緩沖區映射到使用者空間。
  4. 映射後就可以直接讀寫螢幕緩沖區,進行繪圖和圖檔顯示了。

資料結構

  • Struct fb_fix_screeninfo:記錄了幀緩沖裝置和指定顯示模式的不可修改資訊。它包含了螢幕緩沖區的實體位址和長度。
  • Struct fb_var_screeninfo:記錄了幀緩沖裝置和指定顯示模式的可修改資訊。它包括顯示螢幕的分辨率、每個像素的比特數和一些時序變量。其中變量 xres定義了螢幕一行所占的像素數,yres定義了螢幕一列所占的像素數,bits_per_pixel定義了每個像素用多少個位來表示。
  • Struct fb_info:Linux為幀緩沖裝置定義的驅動層接口。它不僅包含了底層函數,而且還有記錄裝置狀态的資料。每個幀緩沖裝置都與一個fb_info結 構相對應。其中成員變量modename為裝置名稱,fontname為顯示字型,fbops為指向底層操作的函數的指針。

代碼及其解釋

該程式在 fedora 7 上編譯通過

#include <unistd.h>

#include <stdio.h>

#include <fcntl.h>

#include <linux/fb.h>

#include <sys/mman.h>



int main () {



    int fbfd = 0;

    struct fb_var_screeninfo vinfo;

    struct fb_fix_screeninfo finfo;

    long int screensize = 0;

    char *fbp = 0;

    int x = 0, y = 0,i;

    long int location = 0;



    /* Open the file for reading and writing */

    fbfd = open("/dev/fb0", O_RDWR);

    if (fbfd < 0) {

        printf("Error: cannot open framebuffer device./n");

        return -1;

    }

    printf("The framebuffer device was opened successfully./n");



    /* Get fixed screen information */

    if (ioctl(fbfd, FBIOGET_FSCREENINFO, &finfo)) {

        printf("Error reading fixed information./n");

        return -1;

    }



    /* Get variable screen information */

    if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) {

        printf("Error reading variable information./n");

        return -1;

    }



    printf ("The mem is %d/n", finfo.smem_len);

    printf("The line_length is :%d/n",finfo.line_length);

    printf("The xres is :%d/n",vinfo.xres);

    printf("The yres is :%d/n",vinfo.yres);

    printf("bits_per_pixel is :%d/n",vinfo.bits_per_pixel);



    close(fbfd);

    return 0;

}



      

繼續閱讀