|
在GEC6818開(kāi)發(fā)平臺(tái)上可以顯示JPG格式的圖片
一. 任務(wù):顯示RGB顏色LCD液晶屏幕中 --> 例如: 填充紫色到LCD上。
1. 分析技術(shù)點(diǎn)
1)了解LCD液晶屏幕組成架構(gòu)?
2)在嵌入式平臺(tái)如何處理LCD屏幕?
3)如何在工程訪問(wèn)LCD液晶屏?
4)如何寫入數(shù)據(jù)到LCD屏幕中?數(shù)據(jù)是什么?該如何表示顏色?
二. 研究LCD液晶屏幕參數(shù)
1. 什么是分辨率?GEC6818平臺(tái)LCD屏幕分辨率是多少?
分辨率指的是設(shè)備總像素點(diǎn)數(shù)是多少,例如:電視機(jī)1080*720 -> 一共有1080*720這么多個(gè)像素點(diǎn)
GEC6818平臺(tái)分辨率->800*480
2. 什么是像素點(diǎn)?
像素,就是圖像元素,指的是由RGB顏色組成一個(gè)點(diǎn)。
3. 究竟每個(gè)像素點(diǎn)如何組成?
像素點(diǎn)占多少個(gè)字節(jié)數(shù)? --> 通過(guò)在GEC6818平臺(tái)輸入命令知道
[root@GEC6818 /]#cat /sys/class/graphics/fb0/bits_per_pixel
32
---> 1個(gè)像素點(diǎn) --> 32位
已知:1個(gè)字節(jié) = 8位
---> 1個(gè)像素點(diǎn) --> 4個(gè)字節(jié)
結(jié)論: 每一個(gè)像素點(diǎn) --> 透明度,紅色,綠色,藍(lán)色
三. 在嵌入式平臺(tái)如何處理LCD屏幕?
原理:在linux下,一切都是文件。 --->在linux下,LCD液晶屏是被看作是一個(gè)文件。
LCD液晶屏幕對(duì)應(yīng)的文件名是什么?
--->規(guī)律:嵌入式平臺(tái)硬件設(shè)備文件名存放dev目錄 dev->device
1. 切換到/dev目錄下
[root@GEC6818 /]#cd /dev/
[root@GEC6818 /dev]#
2. 查看當(dāng)前目錄下所有的文件名是什么?
[root@GEC6818 /dev]#ls
fb0 --> 就是LCD液晶屏幕的文件名
四. 如何在工程訪問(wèn)/關(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:需要打開(kāi)的文件的路徑名 -> 文件在哪里?
flags:操作文件的權(quán)限
O_RDONLY --> read only -> 只讀
O_WRONLY --> write only -> 只寫
O_RDWR --> read write -> 可讀可寫
返回值是什么?
成功:new file descriptor -> 新的文件描述符 --> 其實(shí)是大于等于0 >=0
失。-1
2. 如何關(guān)閉?
在Ubuntu中,輸入命令查看close函數(shù)使用方法:
頭文件是什么?
#include <unistd.h>
函數(shù)原型是什么?
int close(int fd);
參數(shù)填什么?
fd: -> file descriptor -> 文件描述符
返回值是什么?
成功:0
失。-1
練習(xí): 寫一個(gè)程序 --> LCD設(shè)備名字: /dev/fb0
1. 首先訪問(wèn)LCD屏幕
如果訪問(wèn)成功,則在終端打印open lcd ok!
如果訪問(wèn)失敗,則在終端打印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é)論: 每一個(gè)像素點(diǎn) --> 透明度,紅色,綠色,藍(lán)色
例子:紅色如何表示?
一個(gè)像素點(diǎn)=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
}
-----------------------------------------------
練習(xí):填充紫色到LCD屏幕。
一. 項(xiàng)目: 基于網(wǎng)絡(luò)遠(yuǎn)程控制多媒體系統(tǒng)
socket通信
客戶端 <------------> 服務(wù)器
UI界面 播放視頻
觸摸屏 控制視頻狀態(tài)
二. UI界面如何設(shè)計(jì)?JPG格式圖形特點(diǎn)?JPG圖片如何顯示LCD液晶屏幕?
1. UI界面如何設(shè)計(jì)?
已知GEC6818平臺(tái)LCD液晶屏幕分辨率->800*480 -->橫:800個(gè)像素點(diǎn) 豎:480個(gè)像素點(diǎn)
想在LCD液晶上全屏顯示JPG格式圖片-> UI界面->分辨率:800*480
2. 根據(jù)項(xiàng)目要求設(shè)計(jì)UI界面
1)按鈕內(nèi)容
控制視頻狀態(tài):快進(jìn)、快退、音量+、音量-、暫停/繼續(xù)、靜音/恢復(fù)、退出。
2)按鈕大小 -> 由于在客戶端中觸摸屏控制按鈕,所以必須清楚知道按鈕的范圍!
畫圖軟件:
重新調(diào)整大小->像素->把"保持縱橫比"選項(xiàng)去掉
水平:800
垂直:480
3. 為什么選擇使用jpg格式圖片?
由于jpg格式文件經(jīng)過(guò)壓縮的,所以文件大小相對(duì)其它格式圖片較小,方便開(kāi)發(fā)時(shí)進(jìn)行數(shù)據(jù)傳輸。
而且顯示jpg圖片編譯移植jpg庫(kù),然后jpg源碼調(diào)用庫(kù)里面的接口就可以。
三. JPG圖片如何顯示LCD液晶屏幕?
任務(wù): UI.jpg --> 顯示在GEC6818平臺(tái)
首先拿到兩個(gè)文件:
jpeg_show.c --> 顯示jpg圖片的源碼
jpegsrc.v9a.tar.gz --> jpg庫(kù)
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
編譯出錯(cuò):
error: jpeglib.h: No such file or directory -> 找不到j(luò)peglib.h這個(gè)頭文件。
jpeglib.h->其實(shí)是存在于jpg庫(kù)中,所以編譯之前,首先要編譯移植jpg庫(kù)。
四. 編譯移植jpg庫(kù)?
1. 什么是編譯移植?
其實(shí)就是安裝jpg庫(kù)的文件到Ubuntu linux系統(tǒng)中。
2. 如何編譯移植?
jpegsrc.v9a.tar.gz --> jpg庫(kù): 開(kāi)源免費(fèi)
1)先把jpg庫(kù)放置在共享目錄下
2)在linux中,切換到j(luò)pg庫(kù)所在的路徑下
gec@ubuntu:~$ cd /mnt/hgfs/zdnf/02/
3)在linux中解壓jpg庫(kù),一般地解壓到家目錄下 --> 因?yàn)樵诩夷夸浵,擁有一切?quán)限。
gec@ubuntu:/mnt/hgfs/zdnf/02$ tar zxvf jpegsrc.v9a.tar.gz -C ~
tar: 解壓/壓縮的linux命令
z: 處理以.gz結(jié)尾的壓縮包
x: 解壓 c:壓縮
v: 以可見(jiàn)的方式進(jìn)行解壓,這個(gè)參數(shù)不是必須。
f: 文件
-C: 指定解壓之后的路徑
~: 家目錄
如果有v選項(xiàng),則會(huì)打印解壓的過(guò)程
jpeg-9a/
jpeg-9a/wrppm.c
jpeg-9a/wrrle.c
jpeg-9a/maketdsp.vc6
jpeg-9a/jdinput.c
4)回到家目錄下,看看有沒(méi)有一個(gè)新的目錄叫jpeg-9a/
gec@ubuntu:/mnt/hgfs/zdnf/02$ cd ~
gec@ubuntu:~$ ls --> 看到j(luò)peg-9a/目錄
5)在家目錄下創(chuàng)建一個(gè)新的目錄,作為安裝之后的目錄,并給予權(quán)限
創(chuàng)建目錄linux命令:mkdir --> make diretcory
gec@ubuntu:~$ mkdir jpgbuf --> 創(chuàng)建目錄
gec@ubuntu:~$ chmod 777 jpgbuf --> 修改目錄權(quán)限
為什么要修改目錄權(quán)限?
因?yàn)樵趙indows中,創(chuàng)建了一個(gè)新的文件夾,我們可以直接把文件丟進(jìn)去。
但是在linux下,創(chuàng)建一個(gè)新的目錄,是默認(rèn)沒(méi)有寫的權(quán)限,我們不能丟文件進(jìn)去,所以就沒(méi)辦法安裝到目錄中
--> 結(jié)論: 創(chuàng)建完目錄后,通過(guò)chmod命令給予權(quán)限。
6)切換到解壓之后的目錄下
gec@ubuntu:~$ cd ~/jpeg-9a/
gec@ubuntu:~/jpeg-9a$ ls --> 看到一個(gè)文件,叫configure -> 配置文件。
7)配置
gec@ubuntu:~/jpeg-9a$ ./configure --host=arm-linux --prefix=/home/gec/jpgbuf
其中:
./configure --> 執(zhí)行當(dāng)前目錄下的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個(gè)目錄,則編譯移植jpg庫(kù)成功!
五. 分析jpg庫(kù)編譯移植之后文件有哪些?
bin:
cjpeg djpeg jpegtran rdjpgcom wrjpgcom --> 二進(jìn)制文件
include:
jconfig.h jerror.h jmorecfg.h jpeglib.h --> jpg庫(kù)頭文件
lib:
libjpeg.a libjpeg.la libjpeg.so libjpeg.so.9 libjpeg.so.9.1.0 --> 庫(kù)文件
share:
man --> 幫助文檔
六. 已經(jīng)編譯移植完,接下來(lái)讓源碼調(diào)用庫(kù)里面的內(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
編譯出錯(cuò):error: jpeglib.h: No such file or directory
為什么編譯移植之后,還是找不到?
因?yàn)橛脩艟幾g移植完jpg庫(kù)之后,編譯器是不知道已經(jīng)編譯完成了,所以我們需要告訴編譯器,頭文件在哪里。
如何告訴編譯器,頭文件在哪里? --> 使用編譯器選項(xiàng): -I 頭文件的路徑
gec@ubuntu:/mnt/hgfs/zdnf/02$ arm-linux-gcc jpeg_show.c -o jpeg_show -I /home/gec/jpgbuf/include
編譯出錯(cuò):
/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'
原因:找不到對(duì)應(yīng)的函數(shù)的定義,函數(shù)的定義其實(shí)在庫(kù)文件中,找不到函數(shù)的定義,其實(shí)就是找不到庫(kù)文件,庫(kù)文件就是lib中。
如何告訴編譯器,庫(kù)文件在哪里? --> 使用編譯器選項(xiàng): -L 庫(kù)文件的路徑 -l庫(kù)的名字
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
編譯出錯(cuò):
/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庫(kù)的名字 --> -l后面是沒(méi)有空格的
libjpeg.so.9.1.0 --> 庫(kù)的名字是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
編譯通過(guò),生成一個(gè)新的文件:jpeg_show
七. 燒寫程序到開(kāi)發(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
解決方案:將缺少的庫(kù)libjpeg.so.9下載到開(kāi)發(fā)板的/lib中
5. 下載libjpeg.so.9到開(kāi)發(fā)板中
[root@GEC6818 /]#cd /lib
[root@GEC6818 /lib]#rx libjpeg.so.9
C
傳輸->發(fā)送Xmodom->選擇libjpeg.so.9文件->發(fā)送
6. 回到根目錄,再下載圖片到開(kāi)發(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 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|