静态字符叠加器指只在视频信号上显示相对固定字符信息的设备,主要用于在视频信号上叠加摄像头位置信息。价格低廉是此类静态字符叠加器的特点之一。
接下来给大家介绍我在hi3516的平台实现的OSD叠加的测试代码,我选择在VI通道进行osd叠加,具体的初始化操作和通道的配置会在下一篇文件会介绍,本文给大家介绍的是通过自己设置一个汉字模或者ASSIC模,然后通过二进制表示,最后读取字模并绘制在相应的图像区域,经过编码后即可显示叠加的内容。
先来了解一下字库的表示格式
一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。 因此,汉字在汉字库中的具体位置计算公式为: 94*(区号-1)+位号-1 。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。 以16*16点阵字库为例, 计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。 以32*32点阵字库为例, 计算公式则为:(94*(区号-1)+(位号-1))*128。汉字库文该从该位置起的128字节信息即记录了该字的字模信息。 先来看一个32为的字模 自己也可以通过excel绘制一个的一个 “一” 对应的二进制代码: unsigned char ZT[128] = { 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x07, 0xFF,0xFF, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00,0x00, 0x00 }; 取字模 memcpy(p, &ZT, 128); //测试使用 把取出来分字模绘制成对应的位图 static inline void do_blit(char *p, char *origin, unsigned int BitbmpPix_X, int x, int y, int font) { char *pixel; int row, col; int y_next = y; int j,k; if(font == hz_font) { for(row = 0; row < 32; row++) { pixel = origin + (BitbmpPix_X * 2 * (y_next)) + x; for(j = 0; j < 4; j++) { for(col = 0; col < 8; col++) { if(bitmap[row*4+j] &(0x80 >> col)) { pixel[(col+j*8)*2] = 0x7f; pixel[(col+j*8)*2+1] = 0xff; } else { pixel[(col+j*8)*2] = 0x00; pixel[(col+j*8)*2+1] = 0x00; } } } y_next++; /* Next line in bitmap */ } } else { for(row = 0; row < 32; row++) { pixel = origin + (BitbmpPix_X * 2 * (y_next)) + x; for(k = 0;k < 2;k++) { for(col = 0; col < 8; col++) { if(bitmap[row*2+k] &(0x80 >> col)) { pixel[(col+k*8)*2] = 0x7f; pixel[(col+k*8)*2+1] = 0xff; } else { pixel[(col+k*8)*2] = 0x00; pixel[(col+k*8)*2+1] = 0x00; } } } y_next++; /* Next line in bitmap */ } } }