热敏打印头打印原理和C实现黑白位图的放大

最近的项目中需要实现单片机控制热敏打印机打印图片和文字的功能,但是所选用的字库IC最多支持32*32的中文点阵和32*16的英文点阵。如果需要显示更大的字体,就需要自己用代码实现将原本的32*32位图放大成64*64的点阵,因为如果放大超过2倍出现明显的锯齿边缘。所以代码中只实现了两倍的放大。

热敏打印机打印原理

热敏打印机,每一次加热一行点阵数据,就此项目所用的热敏打印机一行共有384个加热点,所以每一行总共有384/8=48个字节的点阵数据。

#define MAX_WIDTH 48 //每一行最大打印显示的点阵数量的字节表达

每一个字节共有八位加热数据位,1 最终加热打印成黑色,0则不加热,根据加热数据不同。最终显示不同的加热效果。
把需要打印的字符串规格,转换成相应的字符串点阵缓冲。这里需要注意的是,每一行最多打印48字节的点阵数据,需要处理好每一个字符点阵在这个缓冲中的横竖排列。然后每一次向热敏打印机传送48字节的点阵数据。当加热完一行后,控制步进电机转动,实现送纸功能。

加热一行点阵数据后控制步进电机的转动步数:
步进电机转动步数 = 加热点高度/步进电机转动一步的出纸长度
当遇到结尾遇到换行需要打印空白行时控制步进电机的转动步数:
步进电机转动步数 = 加热点高度/步进电机转动一步的出纸长度*字符高度*行距

当打印图片时,需要提前将图片处理成二进制黑白位图,且宽度控制在48字节之内(如果热敏打印机一行的加热点为48字节),然后将位图数据逐行传送给热敏打印头,每加热一行控制步进电机转动相应的步数。直至需要打印显示的黑白图片的位图数据全部传送打印完。

多灰度色阶的图片打印实现方式(推理猜想)

如果需要让打印出来的图片,呈现出黑灰白更丰富色阶变化时。可以在图片处理时,将图片进行灰度值处理,这时每一行位图所占的字节数应当为:

一行位图所占字节数 = 热敏打印机一行加热点字节数*灰度值色阶

然后根据色阶数对一行进行循环加热,属于当前色阶的则进行加热,不属于的点,则不加热,每个色阶的加热时间按最小灰度值到最大灰度值依次递增。

伪代码

for(色阶数)
{
  for(MAX_WIDTH)
  {
     if(当前点位图数据 == 当前色阶) 
          热敏打印头加热行当前点传1
    else
          热敏打印头加热行当前点传0
  }
  打印头加热数据行(最低加热时间*色阶等级)
}

位图放大原理

当需要把位图放大两倍时,整个图片数据就增加了四倍,属于一点对四点。既是源位图中的第一行第一个点,对应了放大后的位图中的第一行第一第二个点以及第二行第一第二个点。源位图中的一个点实际上对应了放大后位图的2*2个点。

代码解析

1.扫描源位图的每一行

for (uint16_t i = 0;i < srcHigh;i++)

srcHigh为源位图的高度即需要放大的行数

2.扫描一行中需要放大的字节宽度

    for (uint16_t j = 0;j < srcWidth;j++)

srcWidth为源位图的宽度单位字节

3.扫描每一个字节中的每个位,进行放大处理赋值给目标位图缓冲的相应位

srcData = 0x80;
for (uint8_t k = 0; k < 8;k++)
{
       if ((src[i][j]&srcData) != 0)
       {
            dst[i*multiple][j*multiple+((k*multiple)/8)] |= temp;
        }
    temp = temp >> 2; if (temp == 0x00) temp = 0xC0;  
    srcData = srcData >> 1;
}

首先判断一个字节的最高位是否为1,如果是为1,则目标位图的对应的字节的两个相邻位就会被赋值成1;
[j*multiple+((k*multiple)/8)是用来计算字节偏移量的,j*multiple计算出目标位图缓冲对应源位图当前放大字节的初始偏移字节。((k*multiple)/8)则是计算后续偏移量。当计算结果大于等于1时,则偏移一个字节,存放新的放大数据。
temp = temp >> 2; if (temp == 0x00) temp = 0xC0; 二进制11000000转换成十六进制就是0xC0,当高位判断结束后,判断更低一位时,则需要将temp再右移两个位,才能实现对目标位图字节的更低两位赋值。
srcData = srcData >> 1;源位图字节位判断参考值。

完整的实现代码

void bitmapMagnify(uint8_t src[][MAX_WIDTH],uint8_t dst[][MAX_WIDTH],
    uint8_t multiple,uint16_t srcWidth, uint16_t srcHigh )
{
    uint8_t temp = 0xC0;
    uint8_t srcData = 0x80;
    
    switch (multiple)
    {
        case 0x02:
            for (uint16_t i = 0;i < srcHigh;i++)
            {
                for (uint16_t j = 0;j < srcWidth;j++)
                {
                    srcData = 0x80;
                    
                    for (uint8_t k = 0; k < 8;k++)
                    {
                        if ((src[i][j]&srcData) != 0)
                        {
                            dst[i*multiple][j*multiple+((k*multiple)/8)] |= temp;
                        }
                        temp = temp >> 2; if (temp == 0x00) temp = 0xC0;  
                        srcData = srcData >> 1;
                    }
                }
                for (uint8_t a = 0; a < multiple; a++)
                {
                    for (uint16_t b = 0; b < multiple*srcWidth;b++)
                        dst[i*multiple+a][b] = dst[i*multiple][b];
                }
            }
            break;
        case 0x04:
            break;
        case 0x08:
            break;
        default :
            break;
    }
}
/****************************************************
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 激光技术出现于60年代,真正投入实际应用始于70年代初期。最早的激光发射器是充有氦-氖(He-Ne)气体的电子激...
    我是嘻哈大哥阅读 2,981评论 1 6
  • 这蓝天,这老树,是从小爱着的,还好一直在。
    拾起阳光阅读 295评论 3 4
  • 1、新华社:中国削减钢铁产能可能造成40万人失业。此外,中国将建立基金来帮助下岗工人再就业,基金于1月1日设立,根...
    天天金融阅读 140评论 0 0
  • 极简顾名思义就是只保留必须,人是有欲望的生物,特别一点占有欲是人人都绕不开的生物特性。 记得以前看动物世界讲到:猎...
    48岁的张昆阅读 284评论 1 2
  • 浅谈校园暴力、看了视频、微博推送、一段没有马赛克视频迅速进入我的眼帘、在痛苦中寻找诗意的方向是我不允许的、稚嫩的笔...
    南柯二梦阅读 551评论 0 1