海思OSD開發系列(一) SDL_TTF框架移植

參考

  1. 海思平臺freetype、SDL、SDL_TTL的編譯
  2. 交叉編譯freetype
  3. 交叉編譯SDL 安裝配置及環境變量的設置

背景

需求

在海思osd顯示,就是在region疊方塊,我們常用的需求就是疊加 時間戳、通道名稱、log等,做的好一點的可以實現二維碼掃描方塊顯示、天氣信息等等;
需求裏就兩類信息,一種字符、一種圖片,最後的實現其實都一樣,通通轉成位圖bmp疊上去就ok;
今天我們要做的就是搞字體;

字體

  • 點陣式字體
    安防領域,傳統使用點陣式字體,顧名思義就是打點成像,跟老式的針式打印機一個道理;
    優點是字體小、所需資源少,適合內存和flash緊張的低端嵌入式設備;
    舉慄:hzk16、asc16
  • 系統字體
    這種就和我們操作系統上用的一樣,UI都用它,漂亮光滑細膩…
    舉慄:wqy-microhei.ttc(文泉驛_微米黑)
    爲什麼選他?
    開源、自由、免費、漂亮…

爲什麼要用SDL_TTF

講這麼多,都沒到正主,SDL是什麼,SDL是一套開源多媒體框架,很多地方用來做播放器顯示等相關的功能,我們要用到的SDL_TTF,顧名思義就是這個框架的字體模塊
複習下前面講的:

  1. 我們需要顯示文字並選擇了NB的字體
  2. 海思需要位圖來疊osd
    這個兩個加在一起就是,我們需要一個將字體轉換成位圖工具來製作位圖使用osd模塊顯示!
    這個工具就是SDL_TTF!

囉嗦一大堆,不要再問我爲甚要搞這個了!也因爲這個實現很快,三個小時就可以搞定;

當然還有更簡單也更復雜的方式,把時間位圖格式數據轉成多維數組載入在內存裏面,每次只修改變化的數據,這樣就全用代碼實現了;提供思路給大家參考

下載

CSDN同學分享,交友網站下載github 整包,版本有點老,但好像也沒影響

也可以官網自行下載freetype、SDL1、SDL_ttf這三個版本
freetype官網 下載Freetype-2.9

這裏以github資源爲例

交叉編譯

編譯freeType和SDL依賴

解壓使用相同配置

./configure CC=aarch64-himix100-linux-gcc --host=arm-linux --prefix=$PWD/ARM_INSTALL

make -j99; make install
在INSTALL目錄會生成我們需要的LIB和頭文件

SDL_TTF編譯

–with-sdl-prefix
–with-freetype-prefix
-with-freetype-exec-prefix
這裏指定依賴,就是我們上一步剛剛編譯好的目錄
最好換成絕對路徑
配置選項如下

./configure CC=aarch64-himix100-linux-gcc --host=arm-linux --prefix=$PWD/ARM_INSTALL  --with-sdl-prefix=../SDL-1.2.15/ARM_INSTALL --with-freetype-prefix=../freetype-2.4.10/ARM_INSTALL  --with-freetype-exec-prefix=../freetype-2.4.10/ARM_INSTALL

make -j99;make install
完成!!!
將include和lib目錄拷貝出來就ok!

位圖文件測試

主要步驟

  1. 初始化、打開字體
  2. 格式轉換
  3. 存文件
#include <stdio.h>
#include "SDL.h"
#include "SDL_ttf.h"
#include<time.h>

int main(int argc, const char *argv[])
{
    char * pstr = "2019-11-21 15:40:29";
    SDL_PixelFormat *fmt;
    TTF_Font *font;  
    SDL_Surface *text, *temp;  

    if (TTF_Init() < 0 ) 
    {  
        fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());  
        SDL_Quit();
    }  

    font = TTF_OpenFont("/root/nfs_share/wqy-microhei.ttc", 48); 
    if ( font == NULL ) 
    {  
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 48, "ptsize", SDL_GetError());  
    }  

    SDL_Color forecol = {  0xff, 0xff, 0xff, 0xff };  
    text = TTF_RenderUTF8_Solid(font, pstr, forecol);

    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;
    fmt->colorkey = 0xffffffff;
    fmt->alpha = 0xff;

    temp = SDL_ConvertSurface(text, fmt, 0);
    SDL_SaveBMP(temp, "save.bmp"); 

    SDL_FreeSurface(text);  
    SDL_FreeSurface(temp);
    TTF_CloseFont(font);  
    TTF_Quit();  

    return 0;
}

結果

BMP圖片式樣

在這裏插入圖片描述

OSD疊加式樣

在這裏插入圖片描述


創作不易,歡迎點贊和關注,轉載請註明出處!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章