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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

点阵字体的旋转

發(fā)布時(shí)間:2023/12/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 点阵字体的旋转 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近由于工作原因一直在編寫熱敏打印應(yīng)用相關(guān)的代碼,其中就涉及到中文打印。對(duì)于中文打印大概涉及三個(gè)方面的內(nèi)容:中文輸入、漢字編碼與轉(zhuǎn)碼、點(diǎn)陣字體的處理。對(duì)于這三個(gè)方面涉及的知識(shí)還是挺多的,在此就對(duì)點(diǎn)陣字體相關(guān)的內(nèi)容做一個(gè)小結(jié)。

一、點(diǎn)陣字體概述

做過單片機(jī)點(diǎn)陣開發(fā)的同學(xué)肯定不會(huì)陌生,對(duì)于16x16的點(diǎn)陣,當(dāng)某些位點(diǎn)亮某些位熄滅時(shí)就可以顯示文字或圖片。對(duì)于點(diǎn)陣字體其實(shí)就是將這些位的亮滅信息保存在一個(gè)數(shù)組里,將所有字的這些信息都這樣存儲(chǔ)起來就形成了一個(gè)字庫文件。根據(jù)保存信息的不同形成不同的字庫,如HZK16,HZK24,HZK32。

如下HZK16單個(gè)字的存儲(chǔ):

const unsigned char acFontHZKaiTi_16_b0de[32] = {??
________,_X______,
_____X__,_X______,
____XX__,X_XXX___,
__XXX__X,XX__X___,
____X__X,_XX_X___,
___XXX_X,_X__X___,
XXX_X__X,XXXX____,
___XX___,X_X_____,
__X_XX__,X_XXXXX_,
__X_X_XX,XXX_____,
_X__X___,__X_____,
X___X___,__X_____,
____X___,__X_____,
____X___,__X_____,
________,__X_____,
________,________,
};

二、點(diǎn)陣字體的顯示

點(diǎn)陣字體的顯示比較簡單,只需將每個(gè)字節(jié)信息中的每一位按需求顯示或不顯示就行了,直接上代碼(以HZK16為例):

static VOID PrintHzk16Font(UINT8* fontDat)
{
?? ?INT i, j, b;
?? ?UINT8 byte;

?? ?if (fontDat != NULL)
?? ?{
?? ??? ?for (i = 0; i < 16; i++)
?? ??? ?{
?? ??? ??? ?for (j = 0; j < 2; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?byte = fontDat[i*2 + j];
?? ??? ??? ??? ?for (b = 7; b >=0; b--)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if (byte & (1<<b))
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?printf("*"); ?//show
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?printf(" "); //hide
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?printf("\n");
?? ??? ?}
?? ?}
}

三、點(diǎn)陣字體的旋轉(zhuǎn)

點(diǎn)陣字體的旋轉(zhuǎn)其實(shí)就是取出數(shù)組中的某個(gè)元素的某一位保存在數(shù)組中的另外某個(gè)元素中的某一位中,根據(jù)旋轉(zhuǎn)方式的不同讀取和保存的方式都不一樣。在此以HZK16字體旋轉(zhuǎn)為例:

#define GET_BIT(src, n) ((src) & (0x01 << (n)))
#define SET_BIT(dst, n) ((dst) |= (0x01 << (n)))

/*
第一列 ? ? ?第二列
________, ________,
______XX, XXXXXX__,
XXXXX_XX, XXXXXX__,
XXXXX_XX, _XX_XX__,
__XX__XX, XXXXXX__,
__XX__XX, _XX_XX__,
XXXXX_XX, _XX_XX__,
XXXXX_XX, XXXXXX__,
前八個(gè)字節(jié)
__XX__XX, XXXXXX__,
__XX____, _XX_____,
__XX____, _XX_____,
__XXX_XX, XXXXXX__,
XXXXX___, _XX_____,
XX___XXX, XXXXXXX_,
_____XXX, XXXXXXX_,
________,________,
后八個(gè)字節(jié)

劃分為四塊,然后一塊一塊的處理

*/
static VOID RotateHzk16Font(UINT8* dst, UINT8* src)
{
?? ?int i, j;

?? ?if (NULL == src || NULL == dst)
?? ?{
?? ??? ?e_WARN("src is null.\n");
?? ??? ?return;
?? ?}
?? ?bzero(dst, FONT16X16_BUF);
?? ?//第一列后8個(gè)字節(jié)
?? ?for (i = 0; i < 8; ++i)
?? ?{
?? ??? ?for (j = 0; j < 8; ++j)
?? ??? ?{
?? ??? ??? ?if (GET_BIT(src[16+j*2], 7-i))
?? ??? ??? ?{
?? ??? ??? ??? ?SET_BIT(dst[i*2], j);
?? ??? ??? ?}
?? ??? ?}?? ??? ?
?? ?}

?? ?//第一列前8個(gè)字節(jié)
?? ?for (i = 0; i < 8; ++i)
?? ?{
?? ??? ?for (j = 0; j < 8; ++j)
?? ??? ?{
?? ??? ??? ?if (GET_BIT(src[j*2], 7-i))
?? ??? ??? ?{
?? ??? ??? ??? ?SET_BIT(dst[1+i*2], j);
?? ??? ??? ?}
?? ??? ?}?? ??? ?
?? ?}

?? ?//第二列后8個(gè)字節(jié)
?? ?for (i = 0; i < 8; ++i)
?? ?{
?? ??? ?for (j = 0; j < 8; ++j)
?? ??? ?{
?? ??? ??? ?if (GET_BIT(src[17+j*2], 7-i))
?? ??? ??? ?{
?? ??? ??? ??? ?SET_BIT(dst[16+i*2], j);
?? ??? ??? ?}
?? ??? ?}?? ??? ?
?? ?}

?? ?//第一列前8個(gè)字節(jié)
?? ?for (i = 0; i < 8; ++i)
?? ?{
?? ??? ?for (j = 0; j < 8; ++j)
?? ??? ?{
?? ??? ??? ?if (GET_BIT(src[1+j*2], 7-i))
?? ??? ??? ?{
?? ??? ??? ??? ?SET_BIT(dst[17+i*2], j);
?? ??? ??? ?}
?? ??? ?}?? ??? ?
?? ?}
}

其實(shí)對(duì)于字體的旋轉(zhuǎn)可以寫一個(gè)通用的算法適合任何字體的旋轉(zhuǎn),在此就不具體實(shí)現(xiàn)了。大概的思路是:根據(jù)字體的大小確定旋轉(zhuǎn)后的空間大小,注意如果字體的寬高不一樣的話旋轉(zhuǎn)后的空間可能會(huì)大于原字體的存儲(chǔ)空間,然后八個(gè)字節(jié)八個(gè)字節(jié)的批量處理。

總結(jié)

以上是生活随笔為你收集整理的点阵字体的旋转的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。