基于jz2440的bmp图片显示应用程序

导读:本篇文章讲解 基于jz2440的bmp图片显示应用程序,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

基于jz2440开发板编写应用程序,实现对BMP图片的读取并显示在4.3寸的LCD显示屏。其中该程序需要依赖于相关图片库:libSDL.so、libSDL-1.2.so.0、libSDL-1.2.so.0.11.4

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h>
#include <sys/mman.h>
int lcd;
int init_lcd()
{
    lcd =  open("/dev/fb0",O_RDWR);  //1.打开LCD设备
    if(lcd == -1)
    {
        perror("open LCD  Err");
        return -1;
    }
    printf("Picture Loading......\n");

}
int uninit_lcd()
{
    close(lcd);        //关闭LCD
}
int show_bmp(char *file)  //显示一张图片 思路
{
    int ret,x,y,i;
    short lcdbuf[480*272*2]; //注意:因为此LCD是一个像素包含两个字节,所以要用short,用int类型则会出错
    char temp[3] = {0};
    char bmpbuf[480*272*3];

    int bmp = open(file,O_RDONLY);    //2.打开bmp图片
    if(bmp == -1)
    {
        perror("open BMP  Err");
        return -1;
    }    

    lseek(bmp, 54, SEEK_SET);  //偏移54个字节

    ret = read(bmp,bmpbuf,480*272*3); //3.读取bmp信息
    if(ret ==-1)
    {
        perror("read BMP  Err");
        return -1;
    }

    for(y=0,i=0;y<272;y++)
    {
        for(x=0;x<480;x++,i+=3)
        {    
                            //        B              G              R
            lcdbuf[(271-y)*480+x] = (bmpbuf[i])>>3 | (bmpbuf[i+1]>>2)<<5 | (bmpbuf[i+2]>>3) <<11;//将24位转化为16位算法
        }
    }

    //5.往LCD写数据
    ret = write(lcd,lcdbuf,480*272*2);
    if(ret ==-1)
    {
        perror("write LCD  Err");
        return -1;
    }    
    close(bmp);        //7.关闭图片

    return 0;
}
int main(int argc, char* argv[])
{
    init_lcd(); //LCD 初始化
    show_bmp(argv[1]);
    sleep(1);
    uninit_lcd();//关闭LCD
    return 0;

使用交叉编译工具链,arm-linux-gcc进行编译,实现效果如下:
运行程序:
这里写图片描述
显示图片:
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/117057.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!