在GEC6818開發(fā)平臺上可以顯示JPG格式的圖片
一. 任務(wù):顯示RGB顏色LCD液晶屏幕中 --> 例如: 填充紫色到LCD上。
1. 分析技術(shù)點
1)了解LCD液晶屏幕組成架構(gòu)?
2)在嵌入式平臺如何處理LCD屏幕?
3)如何在工程訪問LCD液晶屏?
4)如何寫入數(shù)據(jù)到LCD屏幕中?數(shù)據(jù)是什么?該如何表示顏色?
二. 研究LCD液晶屏幕參數(shù)
1. 什么是分辨率?GEC6818平臺LCD屏幕分辨率是多少?
分辨率指的是設(shè)備總像素點數(shù)是多少,例如:電視機1080*720 -> 一共有1080*720這么多個像素點
GEC6818平臺分辨率->800*480
2. 什么是像素點?
像素,就是圖像元素,指的是由RGB顏色組成一個點。
3. 究竟每個像素點如何組成?
像素點占多少個字節(jié)數(shù)? --> 通過在GEC6818平臺輸入命令知道
[root@GEC6818 /]#cat /sys/class/graphics/fb0/bits_per_pixel
32
---> 1個像素點 --> 32位
已知:1個字節(jié) = 8位
---> 1個像素點 --> 4個字節(jié)
結(jié)論: 每一個像素點 --> 透明度,紅色,綠色,藍色
三. 在嵌入式平臺如何處理LCD屏幕?
原理:在linux下,一切都是文件。 --->在linux下,LCD液晶屏是被看作是一個文件。
LCD液晶屏幕對應(yīng)的文件名是什么?
--->規(guī)律:嵌入式平臺硬件設(shè)備文件名存放dev目錄 dev->device
1. 切換到/dev目錄下
[root@GEC6818 /]#cd /dev/
[root@GEC6818 /dev]#
2. 查看當前目錄下所有的文件名是什么?
[root@GEC6818 /dev]#ls
fb0 --> 就是LCD液晶屏幕的文件名
四. 如何在工程訪問/關(guān)閉LCD液晶屏? --> 新的函數(shù):open
1. 在Ubuntu中,輸入命令查看open函數(shù)用法
gec@ubuntu:~$ man 2 open --> 結(jié)束查詢->按‘q’
頭文件是什么?
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函數(shù)原型是什么?
int open(const char *pathname, int flags);
參數(shù)填什么?
pathname:需要打開的文件的路徑名 -> 文件在哪里?
flags:操作文件的權(quán)限
O_RDONLY --> read only -> 只讀
O_WRONLY --> write only -> 只寫
O_RDWR --> read write -> 可讀可寫
返回值是什么?
成功:new file descriptor -> 新的文件描述符 --> 其實是大于等于0 >=0
失。-1
2. 如何關(guān)閉?
在Ubuntu中,輸入命令查看close函數(shù)使用方法:
頭文件是什么?
#include <unistd.h>
函數(shù)原型是什么?
int close(int fd);
參數(shù)填什么?
fd: -> file descriptor -> 文件描述符
返回值是什么?
成功:0
失。-1
練習: 寫一個程序 --> LCD設(shè)備名字: /dev/fb0
1. 首先訪問LCD屏幕
如果訪問成功,則在終端打印open lcd ok!
如果訪問失敗,則在終端打印open lcd error!
2. 然后關(guān)閉LCD屏幕
如果關(guān)閉成功,則在終端打印close lcd ok!
如果關(guān)閉失敗,則在終端打印close lcd error!
參考代碼:
------------------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main() //->函數(shù)頭
{
//->函數(shù)體,寫一些可執(zhí)行的內(nèi)容
//->使用了printf才需要包含頭文件
printf("this is first program!\n");
int lcd_fd;//關(guān)于LCD液晶屏幕的文件描述符
lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd >= 0)
{
printf("open lcd ok!\n");
}
else{
printf("open lcd error!\n");
}
int ret;
ret = close(lcd_fd);
if(ret == 0)
{
printf("close lcd ok!\n");
}
else{
printf("close lcd error!\n");
}
return 0; //->返回值 成功:0 失敗:非0
}
---------------------------------------
五. 如何寫入數(shù)據(jù)到LCD屏幕中?數(shù)據(jù)是什么?該如何表示顏色?
1. 如何寫入? --> 新函數(shù):write()
在Ubuntu中輸入查詢命令:
gec@ubuntu:/mnt/hgfs/zdnf/02$ man 2 write
頭文件是什么?
#include <unistd.h>
函數(shù)原型是什么?
ssize_t write(int fd, const void *buf, size_t count);
參數(shù)填什么?
fd: -> file descriptor -> 文件描述符
buf:-> buffer --> 寫入的數(shù)據(jù)的緩沖區(qū) --> RGB顏色
count: --> 寫入的總字節(jié)數(shù)
返回值是什么?
成功:已經(jīng)寫入的字節(jié)數(shù)
失。-1
2. 數(shù)據(jù)是什么?
既然任務(wù)是填充RGB顏色到LCD屏幕,數(shù)據(jù)就應(yīng)該RGB顏色。
write()
顏色 --------> LCD液晶
3. 該如何表示顏色?
結(jié)論: 每一個像素點 --> 透明度,紅色,綠色,藍色
例子:紅色如何表示?
一個像素點=32位
00000000111111110000000000000000 --> 紅色
0x00FF0000 --> 紅色
0x00FF00FF --> 紫色
0x00FFFF00 --> 黃色
---------------------填充紅色示例代碼-------------------------------
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main() //->函數(shù)頭
{
//->函數(shù)體,寫一些可執(zhí)行的內(nèi)容
//->使用了printf才需要包含頭文件
printf("this is first program!\n");
int lcd_fd;//關(guān)于LCD液晶屏幕的文件描述符
lcd_fd = open("/dev/fb0",O_RDWR);
if(lcd_fd >= 0)
{
printf("open lcd ok!\n");
}
else{
printf("open lcd error!\n");
}
int color = 0x00FF0000;
int i;
for(i=0;i<800*480;i++)
{
write(lcd_fd,&color,4);
}
int ret;
ret = close(lcd_fd);
if(ret == 0)
{
printf("close lcd ok!\n");
}
else{
printf("close lcd error!\n");
}
return 0; //->返回值 成功:0 失。悍0
}
-----------------------------------------------
練習:填充紫色到LCD屏幕。
一. 項目: 基于網(wǎng)絡(luò)遠程控制多媒體系統(tǒng)
socket通信
客戶端 <------------> 服務(wù)器
UI界面 播放視頻
觸摸屏 控制視頻狀態(tài)
二. UI界面如何設(shè)計?JPG格式圖形特點?JPG圖片如何顯示LCD液晶屏幕?
1. UI界面如何設(shè)計?
已知GEC6818平臺LCD液晶屏幕分辨率->800*480 -->橫:800個像素點 豎:480個像素點
想在LCD液晶上全屏顯示JPG格式圖片-> UI界面->分辨率:800*480
2. 根據(jù)項目要求設(shè)計UI界面
1)按鈕內(nèi)容
控制視頻狀態(tài):快進、快退、音量+、音量-、暫停/繼續(xù)、靜音/恢復、退出。
2)按鈕大小 -> 由于在客戶端中觸摸屏控制按鈕,所以必須清楚知道按鈕的范圍!
畫圖軟件:
重新調(diào)整大小->像素->把"保持縱橫比"選項去掉
水平:800
垂直:480
3. 為什么選擇使用jpg格式圖片?
由于jpg格式文件經(jīng)過壓縮的,所以文件大小相對其它格式圖片較小,方便開發(fā)時進行數(shù)據(jù)傳輸。
而且顯示jpg圖片編譯移植jpg庫,然后jpg源碼調(diào)用庫里面的接口就可以。
三. JPG圖片如何顯示LCD液晶屏幕?
任務(wù): UI.jpg --> 顯示在GEC6818平臺
首先拿到兩個文件:
jpeg_show.c --> 顯示jpg圖片的源碼
jpegsrc.v9a.tar.gz --> jpg庫
1. 在Ubuntu中,切換到源碼所在的路徑
gec@ubuntu:~$ cd /mnt/hgfs/zdnf/02/
2. 嘗試在Ubuntu Linux系統(tǒng)編譯源碼:
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show
編譯出錯:
error: jpeglib.h: No such file or directory -> 找不到j(luò)peglib.h這個頭文件。
jpeglib.h->其實是存在于jpg庫中,所以編譯之前,首先要編譯移植jpg庫。
四. 編譯移植jpg庫?
1. 什么是編譯移植?
其實就是安裝jpg庫的文件到Ubuntu linux系統(tǒng)中。
2. 如何編譯移植?
jpegsrc.v9a.tar.gz --> jpg庫: 開源免費
1)先把jpg庫放置在共享目錄下
2)在linux中,切換到j(luò)pg庫所在的路徑下
gec@ubuntu:~$ cd /mnt/hgfs/zdnf/02/
3)在linux中解壓jpg庫,一般地解壓到家目錄下 --> 因為在家目錄下,擁有一切權(quán)限。
gec@ubuntu:/mnt/hgfs/zdnf/02$ tar zxvf jpegsrc.v9a.tar.gz -C ~
tar: 解壓/壓縮的linux命令
z: 處理以.gz結(jié)尾的壓縮包
x: 解壓 c:壓縮
v: 以可見的方式進行解壓,這個參數(shù)不是必須。
f: 文件
-C: 指定解壓之后的路徑
~: 家目錄
如果有v選項,則會打印解壓的過程
jpeg-9a/
jpeg-9a/wrppm.c
jpeg-9a/wrrle.c
jpeg-9a/maketdsp.vc6
jpeg-9a/jdinput.c
4)回到家目錄下,看看有沒有一個新的目錄叫jpeg-9a/
gec@ubuntu:/mnt/hgfs/zdnf/02$ cd ~
gec@ubuntu:~$ ls --> 看到j(luò)peg-9a/目錄
5)在家目錄下創(chuàng)建一個新的目錄,作為安裝之后的目錄,并給予權(quán)限
創(chuàng)建目錄linux命令:mkdir --> make diretcory
gec@ubuntu:~$ mkdir jpgbuf --> 創(chuàng)建目錄
gec@ubuntu:~$ chmod 777 jpgbuf --> 修改目錄權(quán)限
為什么要修改目錄權(quán)限?
因為在windows中,創(chuàng)建了一個新的文件夾,我們可以直接把文件丟進去。
但是在linux下,創(chuàng)建一個新的目錄,是默認沒有寫的權(quán)限,我們不能丟文件進去,所以就沒辦法安裝到目錄中
--> 結(jié)論: 創(chuàng)建完目錄后,通過chmod命令給予權(quán)限。
6)切換到解壓之后的目錄下
gec@ubuntu:~$ cd ~/jpeg-9a/
gec@ubuntu:~/jpeg-9a$ ls --> 看到一個文件,叫configure -> 配置文件。
7)配置
gec@ubuntu:~/jpeg-9a$ ./configure --host=arm-linux --prefix=/home/gec/jpgbuf
其中:
./configure --> 執(zhí)行當前目錄下的configure文件
--host=arm-linux --> 指定是交叉編譯
--prefix=/home/gec/jpgbuf -->指定安裝路徑
8)編譯
gec@ubuntu:~/jpeg-9a$ make
make all-am
make[1]: Entering directory `/home/gec/jpeg-9a'
make[1]: Leaving directory `/home/gec/jpeg-9a' --> 則需要清除鏈接文件
gec@ubuntu:~/jpeg-9a$ make clean -> 清除鏈接文件
rm -f cjpeg djpeg jpegtran rdjpgcom wrjpgcom
test -z "testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg testoutt.jpg" || rm -f testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg testoutt.jpg
test -z "libjpeg.la" || rm -f libjpeg.la
rm -f ./so_locations
rm -rf .libs _libs
rm -f *.o
rm -f *.lo
gec@ubuntu:~/jpeg-9a$ make --> 重新編譯
CC jaricom.lo
CC jcapimin.lo
CC jcapistd.lo --> 正在編譯
9)安裝
gec@ubuntu:~/jpeg-9a$ make install
安裝結(jié)果:切換到j(luò)pgbuf路徑看看
gec@ubuntu:~/jpeg-9a$ cd ~/jpgbuf
gec@ubuntu:~/jpgbuf$ ls
bin include lib share --> 如果看到有4個目錄,則編譯移植jpg庫成功!
五. 分析jpg庫編譯移植之后文件有哪些?
bin:
cjpeg djpeg jpegtran rdjpgcom wrjpgcom --> 二進制文件
include:
jconfig.h jerror.h jmorecfg.h jpeglib.h --> jpg庫頭文件
lib:
libjpeg.a libjpeg.la libjpeg.so libjpeg.so.9 libjpeg.so.9.1.0 --> 庫文件
share:
man --> 幫助文檔
六. 已經(jīng)編譯移植完,接下來讓源碼調(diào)用庫里面的內(nèi)容。
1. 切換到源碼的位置
gec@ubuntu:~/jpgbuf/share$ cd /mnt/hgfs/zdnf/02/
2. 重新編譯
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show
編譯出錯:error: jpeglib.h: No such file or directory
為什么編譯移植之后,還是找不到?
因為用戶編譯移植完jpg庫之后,編譯器是不知道已經(jīng)編譯完成了,所以我們需要告訴編譯器,頭文件在哪里。
如何告訴編譯器,頭文件在哪里? --> 使用編譯器選項: -I 頭文件的路徑
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include
編譯出錯:
/tmp/cc2O0oBN.o: In function `main':
jpeg_show.c:(.text+0x440): undefined reference to `jpeg_std_error'
jpeg_show.c:(.text+0x45c): undefined reference to `jpeg_CreateDecompress'
jpeg_show.c:(.text+0x474): undefined reference to `jpeg_mem_src'
原因:找不到對應(yīng)的函數(shù)的定義,函數(shù)的定義其實在庫文件中,找不到函數(shù)的定義,其實就是找不到庫文件,庫文件就是lib中。
如何告訴編譯器,庫文件在哪里? --> 使用編譯器選項: -L 庫文件的路徑 -l庫的名字
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include -L /home/gec/jpgbuf/lib
編譯出錯:
/tmp/cc2O0oBN.o: In function `main':
jpeg_show.c:(.text+0x440): undefined reference to `jpeg_std_error'
jpeg_show.c:(.text+0x45c): undefined reference to `jpeg_CreateDecompress'
jpeg_show.c:(.text+0x474): undefined reference to `jpeg_mem_src'
-l庫的名字 --> -l后面是沒有空格的
libjpeg.so.9.1.0 --> 庫的名字是lib與.so中間的名字
--> -ljpeg
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include -L /home/gec/jpgbuf/lib -ljpeg
編譯通過,生成一個新的文件:jpeg_show
七. 燒寫程序到開發(fā)板中
1. 燒寫可執(zhí)行程序,輸入燒寫命令
[root@GEC6818 /]#cd /
[root@GEC6818 /]#rx jpeg_show
C
2. 傳輸->發(fā)送Xmodom->選擇jpeg_show文件->發(fā)送
3. 修改權(quán)限
[root@GEC6818 /]#chmod 777 jpeg_show
4. 執(zhí)行
[root@GEC6818 /]#./jpeg_show
./jpeg_show: error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory
解決方案:將缺少的庫libjpeg.so.9下載到開發(fā)板的/lib中
5. 下載libjpeg.so.9到開發(fā)板中
[root@GEC6818 /]#cd /lib
[root@GEC6818 /lib]#rx libjpeg.so.9
C
傳輸->發(fā)送Xmodom->選擇libjpeg.so.9文件->發(fā)送
6. 回到根目錄,再下載圖片到開發(fā)板中
[root@GEC6818 /]#cd /
[root@GEC6818 /]#rx UI.jpg
C
傳輸->發(fā)送Xmodom->選擇UI.jpg文件->發(fā)送
7. 最后一步
[root@GEC6818 /]#./jpeg_show UI.jpg
全部資料51hei下載地址:
02.zip
(1.38 MB, 下載次數(shù): 38)
2019-5-24 19:18 上傳
點擊文件名下載附件
|