寫這類教程的目的是, 熟悉Linux基本操作和嵌入式開發流程, 希望對你有所幫助.
前面我們講過系統起來後開機LOGO的製作, 韋老師第3期講了如何顯示jpeg圖片, 那麼怎麼顯示bmp圖片?這次我們藉助libSDL來實現,我們先移植SDL到Ubuntu, 體驗它的威力後再移植到開發板。
一、移植SDL到Ubuntu
Ubuntu: Ubuntu9.10
gcc version 3.4.5
1、新建show_bmp_file.c,內容如下:
/********************************************************
文件名稱: show_bmp_file.c ******
程序功能: 顯示一張bmp圖片到屏幕 ******
*********************************************************/
#include <stdio.h>
#include "SDL/SDL.h"
int main(int argc,char **argv)
{
if (argc != 2 )
{
printf("Usage: %s xxx.bmp \n",argv[0]);
return 0;
}
SDL_Surface *screen = NULL;
SDL_Surface * image= NULL;
//SDL初始化
if(SDL_Init(SDL_INIT_VIDEO)== -1)
{
printf("Initialize SDL error:%s \n",SDL_GetError());
return -1;
}
screen =SDL_SetVideoMode(480, 272, 32, SDL_SWSURFACE|SDL_ANYFORMAT); //設置了LCD最大能顯示的分辨率
if(screen == NULL)
{
printf("Set 480*272*32 error: %s\n",SDL_GetError());
return -1;
}
SDL_ShowCursor(0);
image =SDL_LoadBMP(argv[1]);
if(image == NULL)
{
printf("Could not load %s : %s\n",argv[1],SDL_GetError());
return -1;
}
if(screen->format->palette &&image->format->palette)
{
SDL_SetColors(screen,image->format->palette->colors,0,image->format->palette->ncolors);
}
if(SDL_BlitSurface(image,NULL,screen,NULL) < 0)
{
printf("SDL_BlitSurface error:%s \n",SDL_GetError());
return -1;
}
SDL_UpdateRect(screen, 0, 0, image->w, image->h);
printf("Pressany key to continue......");
getchar();
SDL_FreeSurface(image);
SDL_FreeSurface(screen);
SDL_Quit();
return 0;
}
2、Ubuntu下編譯show_bmp_file.c
$ gcc show_bmp_file.c -o pc
有錯誤:
錯誤原因:沒有安裝libsdl庫。
解決辦法:使用下面的命令安裝libsdl。
$ sudo apt-get install libsdl1.2-dev //前提是Ubuntu 能上網
再次編譯又有錯誤:
錯誤原因:找不到SDL函數實現
解決辦法:編譯時指定鏈接的庫文件SDL
$ gcc show_bmp_file.c-o pc -lSDL
編譯成功生成可執行文件:
3、運行pc:
$./ pc witcher.bmp // witcher.bmp是480*272分辨率bmp格式圖片,事先把它拷貝到Ubuntu相應目錄
現象如下
好俊的馬啊~
二、移植SDL到JZ2440
Ubuntu: Ubuntu9.10
開發板:JZ2440
任意uboot
kernel:Linux-2.6.22.6
文件系統:fs_qtopia.yaffs2
編譯器:arm-linux-gcc-3.4.2
1.到官網下載 SDL-1.2.15.tar.gz, 並上傳到Ubuntu
解壓
$ tar zxf SDL-1.2.15.tar.gz
$ cd SDL-1.2.15/
$ mkdir tmp
配置
$./configure--prefix=${PWD}/tmp --disable-video-nanox -disable-video-qtopia --disable-video-photon--disable-video-ggi --disable-video-svga --disable-video-aalib--disable-video-dummy --disable-video-directfb --disable-video-dga --disable-arts--disable-esd --disable-alsa --disable-video-x11 --disable-nasm--enable-input-tslib --enable-video-fbcon --host=arm-linux --build=i386 CC=arm-linux-gcc CXX=arm-linux-g++
編譯安裝
$ make &&make install
這時tmp下多了4個目錄,這就是編譯SDL所得到的文件
2、同樣編譯show_bmp_file.c,和之前不同的是,這次是交叉編譯
$ cd ..
$ cd show_bmp //這是筆者之前創建的目錄,用於存放測試程序
$ arm-linux-gccshow_bmp_file.c -o show_bmp_file -I /work/SDL-1.2.15/tmp/include -L/work/SDL-1.2.15/tmp/lib-lSDL
3、拷貝SDL庫,應用程序、bmp圖片到文件系統
拷貝方法不需要再細講了吧,筆者習慣用NFS,筆者的內核已經燒到jz2440,只需拷貝應用程序和bmp圖片到文件系統下即可
$ cd tmp
$ sudo cp -rfd lib/* /work/busybox-1.21.0/rootfs/lib/
進入show_bmp目錄
$ sudo cp show_bmp_file /work/busybox-1.21.0/rootfs/
$ sudo cp witcher.bmp /work/busybox-1.21.0/rootfs/
5、在jz2440上顯示圖片:
./show_bmp_filewitcher.bmp