wpf计算字符大小占像素_LCD作为终端显示字符串的过程
LCD作為終端顯示字符串的過(guò)程
1.本文目的
2.資源評(píng)估
3.顯示原理
4.嵌入式上漢字處理
5.結(jié)果驗(yàn)證與展示
6.總結(jié)
1.本文目的
做嵌入式圖形開(kāi)發(fā),我們往往都會(huì)利用到各種GUI進(jìn)行交互設(shè)計(jì),但是對(duì)于GUI的字符串處理與中文字庫(kù)顯示,也許并不會(huì)特別關(guān)注,因?yàn)镚UI已經(jīng)幫助我們封裝了一些通用的API,在調(diào)用相對(duì)應(yīng)的API就可以顯示想要的圖像和字符串了。那么這些底層原理到底是什么呢?
正好和朋友討論,我們做嵌入式開(kāi)發(fā)都是將輸出信息定位到串口,那能不能定位到I2C、SPI、網(wǎng)絡(luò)等各種協(xié)議上去呢?這個(gè)確實(shí)是有意思的事情,那正好手上有個(gè)樹(shù)莓派,可以通過(guò)DSI或者HDMI來(lái)顯示,那就把rt-thread的console重定位到LCD上去吧,讓樹(shù)莓派的屏幕代替我們的串口調(diào)試助手控制臺(tái),這樣就不用接上串口看輸出信息了。
有了這個(gè)想法,于是立即付諸行動(dòng)。需求很明確,開(kāi)發(fā)平臺(tái)也已經(jīng)確定,樹(shù)莓派4+HDMI屏(分辨率1280x800)?;蛘呓覦SI的MIPI屏,我發(fā)現(xiàn)樹(shù)莓派的HDMI驅(qū)動(dòng)原來(lái)和DSI的MIPI屏的驅(qū)動(dòng)一樣,所以?xún)烧邲](méi)有區(qū)別。為了簡(jiǎn)化驗(yàn)證的操作流程,可以選擇rtos,這里我就用比較熟悉的rt-thread。因?yàn)閞t-thread有著和Linux類(lèi)似的控制終端,這樣更加方便對(duì)接。
2.資源評(píng)估
有了想法,若要想進(jìn)行下去,必須評(píng)估一下手上的資源是否齊全。下面列出必要的資源
1.樹(shù)莓派4
選擇樹(shù)莓派4作為驗(yàn)證平臺(tái),是我因?yàn)楝F(xiàn)在手上環(huán)境搭建已經(jīng)很方便了。嵌入式開(kāi)發(fā)的痛點(diǎn)和難點(diǎn)就是在環(huán)境搭建上,一個(gè)好的的開(kāi)發(fā)環(huán)境可以達(dá)到事半功倍的效果。環(huán)境搭建值得好好整理,對(duì)于驗(yàn)證各種功能,實(shí)現(xiàn)各種特性的驗(yàn)證都十分的好用。
2.hdmi屏
由于已經(jīng)完成樹(shù)莓派4的hdmi屏驅(qū)動(dòng)的研究工作,并且hdmi驅(qū)動(dòng)和最后抽象出來(lái)的就是FrameBuffer。操作起來(lái)不用管底層的實(shí)現(xiàn),只需要向這個(gè)Framebuffer的地址處寫(xiě)數(shù)據(jù),會(huì)自動(dòng)將這個(gè)數(shù)據(jù)顯示到LCD的屏上,十分的方便。并不用關(guān)心x,y坐標(biāo),像素等等。
3.字庫(kù)
這里先通過(guò)英文字庫(kù)進(jìn)行演示,后面再談中文字庫(kù)。目前抽取的是開(kāi)源的GUI中的font_dejavu_40字庫(kù)進(jìn)行研究。后面的40表示每個(gè)字符高度為40個(gè)像素,因?yàn)槠恋姆直媛蕿?280x800。如果每個(gè)字符的高度太小則看起來(lái)文字非常的小,在大屏上看起來(lái)十分不友好,所以這里選擇40個(gè)高度的字體,而寬度不定是因?yàn)樽址膶挾仁遣皇谴_定的,每個(gè)字符有著自己的寬度比如L和l兩個(gè)數(shù)字的寬度就不一樣。
有了上述資源,就可以進(jìn)行后面的探究了,下面來(lái)梳理一下顯示原理。
3.顯示原理
計(jì)算機(jī)圖形本質(zhì)上就是像素點(diǎn)的集合,更加具體的就是紅黃藍(lán)三原色的組合。
三原色的排布組成了一個(gè)像素點(diǎn)。實(shí)際LCD放大后像素點(diǎn)看起來(lái)如下圖所示。
而這些像素的亮度決定了最后顯示在屏幕上的效果。像素深度(bits per pixel,簡(jiǎn)稱(chēng)bpp) 描述了每個(gè)像素的位數(shù),比如32位則是RGBA8888,24位常見(jiàn)的RGB565和16位常見(jiàn)的565等等。這些都是一個(gè)像素所能夠表示的信息。
而多個(gè)像素可以表示一個(gè)圖像信息。像素是圖像操作的最小單位,所以下面暫時(shí)不要考慮顏色信息。
來(lái)看一個(gè)字庫(kù)中一個(gè)字符的信息
0x00,?0x00,??//..............0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x1f,?0x80,??//..+%@@@@@.....
0xff,?0x80,??//@@@@@@@@@.....
0xff,?0x80,??//@@@@@@@@@.....
0xe3,?0x80,??//@%%+..@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x03,?0x80,??//......@@@.....
0x7f,?0xfc,??//.@@@@@@@@@@@@@
0x7f,?0xfc,??//.@@@@@@@@@@@@@
0x7f,?0xfc,??//.@@@@@@@@@@@@@
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
0x00,?0x00,??//..............
上述就是字符1在字符中的存放信息,每個(gè)字節(jié)按位展開(kāi),.表示0,@表示1。則右邊的注釋展示了該串字符的信息。如果我們將上述信息告訴給cpu,然后CPU處理這些信息放到LCD上顯示則可以顯示字符串1。
如果把上面的數(shù)組用程序解析交給LCD該如何設(shè)計(jì)。
1.拷貝上述數(shù)組到程序里,作為只有一個(gè)字符的字庫(kù)數(shù)組array
2.申請(qǐng)一塊和framebuff一樣大的內(nèi)存palette,作為圖像輸入的畫(huà)板
3.讀取array第一和第二個(gè)元素,將第一個(gè)元素按高位解析,如果是0向palette填充黑色像素點(diǎn),1向palette填充白色像素點(diǎn)。
字庫(kù)中的每一位對(duì)應(yīng)LCD的一個(gè)像素,如果對(duì)于RGB565來(lái)說(shuō),則表示2個(gè)字節(jié)。那我們可以做這樣的理解。字庫(kù)中1的寬度是32個(gè)像素,高度是40個(gè)像素。
于是可以做標(biāo)準(zhǔn)字庫(kù)的解析了。一個(gè)標(biāo)準(zhǔn)字庫(kù)是包含多個(gè)這樣的字符串結(jié)構(gòu)的,所以字符串需要一張表記錄這些信息,根據(jù)asiic碼表排序,字庫(kù)的存放順序也可如此,然后一個(gè)索引表記錄著每個(gè)字符串的寬度,數(shù)組所在的起始地址信息,有了這些信息,就可以依次做解析然后轉(zhuǎn)換成像素進(jìn)行顯示了。
4.嵌入式上漢字處理
嵌入式上受到資源限制,漢字字庫(kù)一直都不好解決,不能為了顯示漢字把2500~7000個(gè)漢字都收錄進(jìn)去,這樣需要的內(nèi)存資源和flash資源十分龐大。為了解決這個(gè)問(wèn)題,一般都是自定義字庫(kù),就是首先列出該項(xiàng)目中實(shí)際會(huì)用到的所有漢字,然后利用特定的軟件生成對(duì)應(yīng)的像素字符數(shù)組,生成的同時(shí),也會(huì)對(duì)應(yīng)這一張map表,方便查找具體漢字的位置。
在處理英文的時(shí)候,由于所需的字符很少,可以通過(guò)ASCII碼進(jìn)行索引,漢字則可以自定義索引規(guī)則,這些都是需要自己設(shè)計(jì)處理的。但是原理是一樣的。
5.結(jié)果驗(yàn)證與展示
經(jīng)過(guò)上述的操作,已經(jīng)完成了lcd console的任務(wù),可以給自己交差了。
其實(shí)現(xiàn)的代碼也已經(jīng)放到百度網(wǎng)盤(pán)上可以供參考。
鏈接:https://pan.baidu.com/s/17A37ISKT0tW3WWq2oXJASw提取碼:dgr6
上述代碼僅供參考,優(yōu)化部分還需完善。
6.總結(jié)
需要注意的是,對(duì)于不同的LCD,需要自己找到合適的大小的字體,這樣才能看起來(lái)清楚。另外在實(shí)現(xiàn)的細(xì)節(jié)上需要注意的是最好不要在framebuffer上直接繪圖,可以放到一個(gè)與framebuffer大小一樣的數(shù)組中,叫做palette,也就是畫(huà)板。當(dāng)繪制一幀畫(huà)面完成后,再刷新到framebuffer中,這是因?yàn)閒ramebuffer是非cache的,操作起來(lái)會(huì)影響刷屏的幀率,看起來(lái)幀率會(huì)很低。
對(duì)于英文字庫(kù)的顯示、中文漢字的處理,有很多東西需要去拓展。其中漢字的抗鋸齒問(wèn)題就很值得研究學(xué)習(xí),漢字模糊,漢字的銳化等等,萬(wàn)變不離其宗,其核心都是對(duì)像素的處理。LCD繪圖,理解像素處理流程,所有的上層應(yīng)用實(shí)現(xiàn)都非常好理解。
總結(jié)
以上是生活随笔為你收集整理的wpf计算字符大小占像素_LCD作为终端显示字符串的过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: uart口图片_uart 加强了的串口调
- 下一篇: 计算机水平考试ppt试卷,计算机等级考试