n年前写的,现在忘了,来回顾一下:

下面主要对字符的编码,即把字符转化为字节数组,字符如何显示在屏幕上即字符解码工作做了一些原理性分析,虽然有很多编码和解码方式,这是其中一种,但是最终目的是一样的,就是如何把汉字显示在屏幕上。一下仅供参考。

字符编码原理

图片.png

备注:

表示像素没有上色,用0表示该位。

表示像素上色,用1表示该位。

请看上面图:显示汉字“人”,每一小格表示一个像素,显示“人”字一共用了1616个像素,如果每个像素用1位二进制表示的话,那么一共用1616/8=32个字节表示一个字符。如果像素是从左到右,从上到下的方式扫描的:那么

第一行第一个字节是0x01,第二个字节是0x00;

第二行第一个字节是0x01,第二个字节是0x80;依次类推。

那么我们就会得到这样一个字节数组:const unsigned char ren[]=

{0x01,0x00,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x80,0x02,0x80,0x04,0x80,0x04,0x40,0x08,0x60,0x08,0x30,0x10,0x18,0x20,0x0E,0x40,0x04,0x00,0x00}; /"人",0/

这个字节数组就是对各种字符取模的结果,把所有字符拆成一个字节数组,大小为32个字节。

所谓字符取模就是汉字的笔画用一个个像素表示,然后按一定顺序(从左到右,从上到下顺序)将这些像素组成一个字节数组。其中每个字节中的1,表示上色处理(颜色可以自己选择),如》》

,0表示不上色处理(就是,还是默认背景色),如》》

。通过对32位字节分别上色,这样就在屏幕上显示了汉字和其它字符了。

下面是屏幕上显示原理:

//绘制大小为16×16的中文字符,扫描每一行16个像素,一共扫描16行即16*16,

相当于字符解码工作

void Draw_Text16(UINT32 x,UINT32 y,UINT32 color,const unsigned char ch[])

{

// UINT32是自己定义的一个数据类型,相当于int 类型,使用c语言的typedef函数定义数据类型,如typedef unsigned int UINT32。

//x,y这个坐标是指定在屏幕上哪一个位置显示,const unsigned char ren[]表示字符取模后的字节数组,color表示上哪一种颜色,如果颜色是8位的那么有256中可供选择

unsigned short int i,j;

unsigned char mask,buffer;

for(i=0;i<16;i++)

{

//1、i表示行数,每一行16个像素、一共16行,所以每一行16/8=2个字节。

//2、为什么分成两部分写,因为char类型是8位的,而每一行是16位的,所以就分成第一个字节和第二字节了。

//3、每个字节8位,所以分别扫描每一位的值是1还是0,如果是1表示要上色,0表示不上色,然后选择要上哪一种颜色。如果不上色颜色选择白色,一般上色选择黑色。相当于这个word 文档显示方式。

//4、mask不断右移说明要把字节中每一位都要扫描到。

mask=0x80; //掩码

buffer=ch[i*2]; //提取一行的第一个字节

for(j=0;j<8;j++)

{

if(buffer&mask)

{

PutPixel(x+j,y+i,color); //为笔画上色,其实就是把颜色值写到帧内存中相应地址中去,帧就是一幅画面,那么这幅画面就有很多颜色了,每个颜色都有一个固定地址。

}

mask=mask>>1; //扫描字节的每一位,所以mask每扫描一次,就向右移一位。

}

mask=0x80; //掩码,主要是用来扫描每一个字节的每一位是否为1的,如果是1那么就表示要上色,如果为0,表示不上色。

buffer=ch[i*2+1]; //提取一行的第二个字节

for(j=0;j<8;j++)

{

if(buffer&mask)

{

PutPixel(x+j+8,y+i,color); //为笔画上色

}

mask=mask>>1;

}

}

}

PutPixel(x+j+8,y+i,color)函数是为笔画上色的,请看下面

//绘制像素点,给每个像素上色

voidPutPixel(U32 x,U32 y, U32 c )

{

// U32和上面分析的UINT数据类型一样。

LCD_BUFFER[y][x] = c;

// LCD_BUFFER数组表示帧内存的起始地址,y,x就是像素的坐标了,c就是颜色的序号,一共256种颜色,每一种颜色的编号是0-255,就是把颜色写到对应的帧内存地址中去。

}

如果把每个像素用一位来表示,按一定顺序扫描(从左到右,从上到下,这样就确定每一位在屏幕上的位置了),如果这一位是1****表示上色,如果是****0表示不上色,如果一个字符在****1616****个像素面积上显示,那么可以用1616/8=32****个字节来表示这个面积上所有的像素,,注意字节的顺序哦(从右到左,从上到下,这些顺序相当于确定这个汉字笔画的相对位置(i****,****j)了)。如果在****LCD****上给出要显示汉字绝对坐标(x****,****y),那么即可确定汉字每一个像素在****LCD****上显示绝对位置(x+i,y+j****),同时也确定汉字在帧内存中位置(地址)。对于上色问题,我们用****32****个字节中每一位是1****还是****0来做标志,如果是****1****,那么把指定的颜色写到其帧内存位置中去,如是0****就不上色,即默认背景颜色写到帧内存地址中。

字符取模 linux 软件,字符取模显示原理相关推荐

  1. linux icon 字符转换工具,linux ICONV字符GB2312转换UTF8

    #iconv -f GB2312 -t UTF-8 gb1.txt >gb2.txt 将gb1里的编码从GB2312转化成UTF-8  并重定向到gb2.txt 除了iconv命令,我们在lin ...

  2. linux命令取ip,linux下命令取IP地址的多种方法

    经常会遇到在命令行取ip地址,或写脚本引用ip地址,需要使用命令取出来:下面的方法根据实际情况调整 下面的命令环境为centos6.6系统:[root@localhost ~]# ifconfig e ...

  3. c语言取模原理,字符取模显示原理

    n年前写的,现在忘了,来回顾一下: 下面主要对字符的编码,即把字符转化为字节数组,字符如何显示在屏幕上即字符解码工作做了一些原理性分析,虽然有很多编码和解码方式,这是其中一种,但是最终目的是一样的,就 ...

  4. a除b的余数【取模(%)与取余(/)的区别】

    目录 取模(%)与取余(/)的区别 题目描述 输入 输出 Sample Input Sample Output C++代码 Python代码 取模(%)与取余(/)的区别 对于整型数a,b来说,取模运 ...

  5. c语言字符串提取第二个字符,c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例...

    c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例.函数需引入的头文件:#include 定义strncpy()函数:char * strncpy(char *dest, const ...

  6. Java入门-Java学习路线课程面试篇:取商 / 和取余(模) % 符号的使用

    本博客地址 | GitHub | 更多资源免费下载 取商 / 和取余(模) % 符号的使用 文章目录 1. / % 最容易出错的演示案例 2. 运行结果: 1. / % 最容易出错的演示案例 pack ...

  7. C语言字符型变量的存储和取值

    目录 1.问题引入 2.字符型变量的存储 3.字符型变量的取值 4.字符型变量中的-128 5.取值转换图 1.问题引入 我们知道,在C语言中,一个字符型数据占8个bit位,那么当我们定义一个字符型数 ...

  8. java取模负数_JAVA中取模的问题

    ## Java取模(%)运算 > [上篇文章](https://yebukong.com/article/1101070795486109697.html "上篇文章") 提 ...

  9. 取模运算性质_取模运算的性质

    对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 ...

最新文章

  1. 开源的Blink和Spark3.0,谁将称霸大数据领域?
  2. 修改title样式_css常见样式命名规则
  3. iOS应用安全之代码混淆实现篇
  4. TweetBot TabBar
  5. 全栈工程师之路(二)—— JavaScript(网页前端脚本语言)
  6. WebSocket服务器上的oTransactionID_SiteDetailMap的qrcode是何时生成的
  7. 生成top图_最小生成树(Kruskal和Prim算法)
  8. Kroneker Tensor:克罗内克张量
  9. 利用Linq2Sql+Juqery实现通用查询功能
  10. fs和php的区别,优缺点评测飞科fs318和fs360有啥区别?哪个好?真实评测体验曝光...
  11. Windows Sockets网络编程读书笔记(及简单C/S实现)
  12. afm原子力分析软件_AFM数据处理软件|原子力显微镜配套数据处理软件 nanoscope analysis1.8 官方版 - 极光站...
  13. 【微软商店(Microsoft Store)重置后打不开,商店下载不了应用的解决方法】
  14. c语言传送send 函数解析,C语言sendto()函数:经socket传送数据
  15. 个推华为推送、小米推送、苹果推送及角标
  16. 游戏公司的交互设计人员一般都做什么工作?
  17. 100%解决GitHub打不开或者打开慢
  18. 计算机专业国际竞赛,国际计算机竞赛深度剖析
  19. Win2008安装11g报错:orandce11.dll.dbl and orancds11.dll.dbl 文件找不到
  20. 随手记安全吗?随手记手把手教你分析理财平台安全性

热门文章

  1. springboot农村饮用水海量数据存储平台毕业设计源码061205
  2. 【现代机器人学】学习笔记五:逆运动学(Inverse kinematics)
  3. android 商品筛选view,FilterTabView 基于 Popupwindow 实现的筛选房源信息等相关的控件,可以自由排序 @codeKK Android开源站...
  4. 推荐给广大MM们-化妆品品牌中英文对照
  5. 微信小程序在线考试管理系统+后台管理系统
  6. 工程图学及计算机绘图宋卫卫,工程图学及计算机绘图习题集
  7. 基于Python3+PyQt5开发的GUI精美框架界面:导航定位与测量综合系统-GNSSAMS Offcial 1.2.0
  8. 面试集锦-------LRU,LFU手撕算法
  9. 网站快照被劫持怎么办?
  10. Unity AssetBundle一个需要注意的地方