Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15339163
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类: LINUX

2009-07-07 17:26:00

浅析linux中framebuffer下绘制喜洋洋黑白图

1.打开ubnutu 8.10的framebuffer显示功能,使用fbcon内核驱动控制显示器.
2.编译如下源码:

#include <linux/fb.h>
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>

#include "xiyangyang-bitmap.inc" // 包含喜洋洋黑白点阵数据

static char luther_gliethttp_xiyangyang[];
int fb;
unsigned char *fb_mem;

int main(void)
{
    struct fb_var_screeninfo vinfo;
    struct fb_fix_screeninfo finfo;
    int gliethttp_screensize;
    int luther_mmap_size;
    int screen_line_bytes;
    int bitmap_x_size, bitmap_y_size;
    int i, j, m, k;
    int bit_value;
    int xorg, yorg;
    int screen_bytes_per_pixel;
    fb = open("/dev/fb0", O_RDWR);
    ioctl(fb, FBIOGET_FSCREENINFO, &finfo);
    ioctl(fb, FBIOGET_VSCREENINFO, &vinfo);
    // 计算整个屏幕占用字节数[luther.gliethttp]
    screen_bytes_per_pixel = vinfo.bits_per_pixel / 8;
    screen_line_bytes = vinfo.xres * screen_bytes_per_pixel;
    gliethttp_screensize = vinfo.yres * screen_line_bytes;
    printf("vinfo.xres=%d\n"
           "vinfo.yres=%d\n"
           "vinfo.bits_per_pixel=%d\n"
           "gliethttp_screensize=%d\n",
           vinfo.xres, vinfo.yres,
           vinfo.bits_per_pixel,
           gliethttp_screensize);

    luther_mmap_size = gliethttp_screensize;

    fb_mem = mmap(NULL, luther_mmap_size, PROT_READ | PROT_WRITE, MAP_SHARED, fb, 0);
    memset(fb_mem, 0, gliethttp_screensize); // 屏幕填充为黑色

    bitmap_x_size = 800;
    bitmap_y_size = 600;

    xorg = (vinfo.xres - bitmap_x_size) >> 1; // 将图像放在x轴中间
    yorg = 0;

    // 显示黑白二色的喜洋洋[luther.gliethttp]
    for ( i = 0; i < bitmap_y_size; i++)
     for ( j = 0; j < (bitmap_x_size>>3); j++)
      for ( m = 0; m < 8; m++) {
        bit_value = luther_gliethttp_xiyangyang[i*(bitmap_x_size >> 3)+ j] & (0x80 >> m);
        bit_value = bit_value ? 0xff:0x00;
        // bit_value = 0xff;
        for ( k = 0; k < screen_bytes_per_pixel; k++) {
            fb_mem[(yorg+i)*screen_line_bytes + (xorg+(j<<3)+m)*screen_bytes_per_pixel + k] = bit_value;
            // usleep(5);
        }
      }

    munmap(fb_mem, luther_mmap_size);
    close(fb);
    return 0;
}

文件:xiyangyang-bitmap.inc.tar.bz2
大小:16KB
下载:下载
luther@gliethttp:~$ gcc framebuffer-test.c
3.clt+alt+f1切换到文本控制台
root@gliethttp:/home/luther# ./a.out
这样黑白色的喜洋洋就出现在pc的液晶显示器上了:)
阅读(2819) | 评论(8) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-08-21 11:31:01

太棒了,就是解析的在详细点好

gliethttp2009-07-28 08:12:11

vinfo.bits_per_pixel

chinaunix网友2009-07-21 23:48:49

framebuffer在哪可以知道是多少位的啊

chinaunix网友2009-07-21 23:40:19

嗯 我只要处理24位的bmp 谢谢啊 那framebuffer在哪可以知道

gliethttp2009-07-21 23:32:46

不是这么简单,因为bmp有它自己的像素对应的色位深度,需要和framebuffer对应,比如framebuffer的为24位RGB,如果bmp也是是24位色,那么可以按你说的来作,如果显示任何色深的bmp,那么就需要作色深转换工作.