日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Ubuntu >内容正文

Ubuntu

Ubuntu下点阵汉字的字模读取与显示

發布時間:2023/12/9 Ubuntu 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ubuntu下点阵汉字的字模读取与显示 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 一、漢字的區位碼、機內碼編碼規則
      • 1.GB2312標準
      • 2.區位碼
      • 3.機內碼
    • 二、字形數據存儲格式
      • 1. Unicode 字符集和編碼
      • 2.字模
      • 3.漢字點陣獲取
    • 三、在圖片上疊加顯示學號、姓名
    • 四、總結
    • 五、參考資料

一、漢字的區位碼、機內碼編碼規則

1.GB2312標準

GB2312 標準把 ASCII 碼表 127 號之后的擴展字符集直接取消掉,并規定小于 127 的編碼按原來 ASCII 標準解釋字符。當 2 個大于 127 的字符連在一起時,就表示 1 個漢字,第 1 個字節使用 (0xA1-0xFE) 編碼,第 2 個字節使用(0xA1-0xFE)編碼,這樣的編碼組合起來可以表示了 7000 多個符號,其中包含 6763 個漢字。
當我們設定系統使用 GB2312 標準的時候,它遇到一個字符串時,會按字節檢測字符值的大小,檢測原理如下圖。

GB2312 兼容 ASCII 碼的原理圖

2.區位碼

所有的國標漢字及符號分配在一個 94 行、94 列的方
陣中,方陣的每一行稱為一個“區”,編號為 01 區到 94 區,每一列稱為一個“位”,編號為01 位到 94 位,方陣中的每一個漢字和符號所在的區號和位號組合在一起形成的四個阿拉伯數字就是它們的“區位碼”。區位碼的前兩位是它的區號,后兩位是它的位號

GB2312部分區位碼圖

3.機內碼

漢字的機內碼是指在計算機中表示一個漢字的編碼。為了避免機內碼與基本 ASCII 碼的沖突,可以先在區碼和位碼分別加上 20H,在此基礎上再加 80H。經過這些處理,用機內碼表示一個漢字需要占兩個字節,分別 稱為高位字節和低位字節,這兩位字節的機內碼按如下規則表示:

高位字節 = 區碼 + 20H + 80H(或區碼 + A0H)
低位字節 = 位碼 + 20H + 80H(或位碼 + AOH)

二、字形數據存儲格式

1. Unicode 字符集和編碼

國際標準化組織(ISO)重新給全球上所有文化使用的字母和符號進行編號,對每個字符指定一個唯一的編號,ASCII 中原有的字符編號不變, 該編號集稱為Unicode。有UTF-32、UTF-16、UTF-8(兼容ASCII 碼)和BOM幾種編碼方式。

2.字模

計算機必須把字符編碼轉化成對應的字符圖形人類才能正常識別,因此我們要給計算機提供字符的圖形數據,這些數據就是字模,多個字模數據組成的文件也被稱為字庫。在漢字的點陣字庫中,每個字節的每個位都代表一個漢字的一個點,每個漢字都是由一個矩形的點陣組成,0 代表沒有,1 代表有點,將 0 和 1 分別用不同顏色畫出,就形成了一個漢字,常用的點陣矩陣有 12x12、14x14、16x16三種字庫。

16x16點陣

對于 1616 的矩陣來說,它所需要的位數共是 1616=256 個位,每個字節為 8 位,因此,每個漢字都需要用256/8=32 個字節來表示。
即每兩個字節代表一行的 16 個點,共需要 16 行,顯示漢字時,只需一次性讀取 32 個字節,并將每兩個字節為一行打印出來,即可形成一個漢字。

3.漢字點陣獲取

漢字點陣字庫是根據區位碼的順序進行存儲的,因此,我們可以根據區位來獲取一個字庫的點陣,它的計算公式如下:

點陣起始位置 = ((區碼- 1)*94 + (位碼 – 1)) * 漢字點陣字節數

獲取點陣起始位置后,我們就可以從這個位置開始,讀取出一個漢字的點陣。

三、在圖片上疊加顯示學號、姓名

打開終端,創建目錄10thweek,并在目錄下存放下圖所示文件

mkdir 10thweek cd 10thweek


注意該文本文件的編碼格式,將默認的UTF-8改成ANSI否則漢字將出現亂碼問題。

在同一工作目錄下輸入gedit test.cpp,輸入以下代碼,每個圖片文字開始顯示的像素坐標不同,需要自行調整。先根據文本文件的字符提取出相應的字模數據 ,然后計算出字模數據的指針,將字模數據替代對應的像素點即可。

#include<iostream> #include<opencv/cv.h> #include"opencv2/opencv.hpp" #include<opencv/cxcore.h> #include<opencv/highgui.h> #include<math.h> using namespace cv; using namespace std;void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset); void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset); void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path);int main() {String image_path="/home/xxl/10thweek/gaga.jpg";char* logo_path=(char*)"/home/xxl/10thweek/logo.txt";put_text_to_image(80,415,image_path,logo_path);//文字開始顯示的像素坐標return 0; } //在圖片上繪制文字的起點坐標 void paint_ascii(Mat& image,int x_offset,int y_offset,unsigned long offset) {Point p;p.x = x_offset;p.y = y_offset;//存放ascii字膜char buff[16]; //打開ascii字庫文件FILE *ASCII;if ((ASCII = fopen("/home/xxl/10thweek/Asci0816.zf", "rb")) == NULL){printf("Can't open ascii.zf,Please check the path!");//getch();exit(0);}fseek(ASCII, offset, SEEK_SET);fread(buff, 16, 1, ASCII);int i, j;Point p1 = p;for (i = 0; i<16; i++) //十六個char{p.x = x_offset;for (j = 0; j < 8; j++) //一個char8個bit{p1 = p;if (buff[i] & (0x80 >> j)) /*測試當前位是否為1*/{/*由于原本ascii字模是8*16的,不夠大,所以原本的一個像素點用4個像素點替換,替換后就有16*32個像素點*/circle(image, p1, 0, Scalar(0, 0, 255), -1);p1.x++;circle(image, p1, 0, Scalar(0, 0, 255), -1);p1.y++;circle(image, p1, 0, Scalar(0, 0, 255), -1);p1.x--;circle(image, p1, 0, Scalar(0, 0, 255), -1);} p.x+=2; //原來的一個像素點變為四個像素點,所以x和y都應該+2}p.y+=2;} } //在圖片替換像素點 void paint_chinese(Mat& image,int x_offset,int y_offset,unsigned long offset) {Point p;p.x=x_offset;p.y=y_offset;FILE *HZK;char buff[72];//72個字節,用來存放漢字的if((HZK=fopen("/home/xxl/10thweek/HZKf2424.hz","rb"))==NULL){printf("Can't open HZKf2424.hz,Please check the path!");exit(0);//退出}fseek(HZK, offset, SEEK_SET);/*將文件指針移動到偏移量的位置*/fread(buff, 72, 1, HZK);/*從偏移量的位置讀取72個字節,每個漢字占72個字節*/bool mat[24][24];//定義一個新的矩陣存放轉置后的文字字模int i,j,k;for (i = 0; i<24; i++) /*24x24點陣漢字,一共有24行*/{for (j = 0; j<3; j++) /*橫向有3個字節,循環判斷每個字節*/for (k = 0; k<8; k++) /*每個字節有8位,循環判斷每位是否為1*/if (buff[i * 3 + j] & (0x80 >> k)) /*測試當前位是否為1*/{mat[j * 8 + k][i] = true; /*為1的存入新的字膜中*/}else {mat[j * 8 + k][i] = false;}}for (i = 0; i < 24; i++){p.x = x_offset;for (j = 0; j < 24; j++){ if (mat[i][j])circle(image, p, 1, Scalar(255, 0, 0), -1); //替換像素點p.x++; //右移一個像素點}p.y++; //下移一個像素點} } //將漢字放在圖片上 void put_text_to_image(int x_offset,int y_offset,String image_path,char* logo_path) {//x和y就是第一個字在圖片上的起始坐標//通過圖片路徑獲取圖片Mat image=imread(image_path);int length=22;//要打印的字符長度(字節)unsigned char qh,wh;//定義區號,位號unsigned long offset;//偏移量unsigned char hexcode[30];//用于存放記事本讀取的十六進制,記得要用無符號FILE* file_logo;if ((file_logo = fopen(logo_path, "rb")) == NULL){printf("Can't open txtfile,Please check the path!");//getch();exit(0);}fseek(file_logo, 0, SEEK_SET);fread(hexcode, length, 1, file_logo);int x =x_offset,y = y_offset;//x,y:在圖片上繪制文字的起始坐標for(int m=0;m<length;){if(hexcode[m]==0x23){break;//讀到#號時結束}else if(hexcode[m]>0xaf){qh=hexcode[m]-0xaf;//使用的字庫里是以漢字啊開頭,而不是以漢字符號開頭wh=hexcode[m+1] - 0xa0;//計算位碼offset=(94*(qh-1)+(wh-1))*72L;paint_chinese(image,x,y,offset);/*計算在漢字庫中的偏移量對于每個漢字,使用24*24的點陣來表示的一行有三個字節,一共24行,所以需要72個字節來表示*/m=m+2;//一個漢字的機內碼占兩個字節,x+=24;//一個漢字為24*24個像素點,由于是水平放置,所以是向右移動24個像素點 }else{//當讀取的字符為ASCII碼時wh=hexcode[m];offset=wh*16l;//計算英文字符的偏移量paint_ascii(image,x,y,offset);m++;//英文字符在文件里表示只占一個字節,所以往后移一位就行了x+=16;}}cv::imshow("image", image);//顯示圖片cv::waitKey(); }

保存后輸入g++ test.cpp -o test pkg-config --cflags --libs opencv進行編譯,然后輸入./test即可得出結果。

四、總結

在了解了漢字點陣字庫的基本原理后,其實整個實現過程的難度系數不是很大,了解以上的這些知識只是實現液晶顯示的基礎。一開始我的文本文件就是用的UTF-8編碼格式,結果圖片上的漢字是幾個很奇怪的字符,改成ANSI格式就正確了。

五、參考資料

中文點陣字庫及顯示工具程序
提取碼:spbw

總結

以上是生活随笔為你收集整理的Ubuntu下点阵汉字的字模读取与显示的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩精品免费一区二区 | av免费观 | 成人免费网视频 | 久久噜噜色综合一区二区 | 久久伊人爱 | 黄色av免费播放 | 国产麻豆91 | 日韩av黄色片 | 简单av网 | 国产又爽又黄的激情精品视频 | 风流老熟女一区二区三区 | 黄色一级片免费在线观看 | 国产91丝袜在线播放 | 成人av自拍 | 涩涩网站入口 | 777奇米色| av夜夜| 看黄色大片 | 毛片无码免费无码播放 | 91资源在线播放 | 精品影片一区二区入口 | 亚色91 | 午夜骚影| 99热8| 91九色在线| xxxx18日本| 中日韩在线观看 | 九九热在线免费观看 | 国产黄色片子 | 后入内射欧美99二区视频 | av无码精品一区二区三区 | 可以免费看的黄色 | 91成人在线观看国产 | 欧美精品123| 国产精品天天干 | 污污网站在线观看 | 成人三级黄色 | www.亚洲天堂 | 一区=区三区乱码 | 91网站免费在线观看 | 嫩草影院黄色 | 成人av在线资源 | h部分肌肉警猛淫文 | 色网站在线 | 亚洲aa | 人操人| 一区二区中文字幕 | 搡老熟女国产 | 久久成人免费视频 | 香蕉视频最新网址 | 亚洲天堂精品在线观看 | 国产视频69 | 国产高清露脸 | 黄色片xxx | 福利一区福利二区 | 日韩精品综合 | 欧美黄色录像带 | 国产视频资源 | 成人欧美性 | 亚洲欧美日韩国产一区 | 女人下面喷水视频 | 日本人妻一区 | 欧美性网址 | 黄色小说网站在线观看 | 日本老小玩hd老少配 | 成年人看片网站 | 人人草人人干 | 伊人久久大香线 | 少妇99| 亚洲www视频 | 超碰成人在线免费观看 | 欧美又黑又粗 | 欧美日韩一区二区三区在线观看 | 日本xxx高清 | 成熟女人毛片www免费版在线 | 黑丝少妇喷水 | 特黄视频 | 中国黄色一级毛片 | 五月天激情在线 | 国产精品成人av久久 | www.四虎在线 | 日韩免 | 精品国产乱码久久久久久1区2区 | 成人黄色片免费看 | 国产人妻人伦精品1国产盗摄 | 免费三级大片 | 动漫av一区 | 久久91精品国产91久久小草 | 日韩午夜激情 | 亚洲天堂最新 | 久久国产视频播放 | 热热久 | 99免费精品 | 日韩精品一区二区三区久久 | 人人澡人人澡人人澡 | 日韩少妇高潮抽搐 | 国产精品激情偷乱一区二区∴ | 日韩五月天 | 99久久久久 |