logo资料库

YUV数据中添加OSD水印信息.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
在视频中叠加水印时,其原理是用水印数据替换视频原始数据中的相关数 据。需要将水印数据叠加到视频原始数据中,从而在预览这些视频原始数据时可 以看到水印信息,同时将视频原始数据进行编码时,也会将水印数据进行编码, 并保存到编码视频中。 在视频中叠加文字水印时,常采用的方法有两种: ● 将文字水印生成BMP格式的图片,然后用图片数据替换视频原始数据中的 相关数据。 ● 通过字库,在字库中查找相关文字,然后将其叠加到视频中 以上两种方法,方法二的适用性更强。  BMP图片是Bitmap(位图)的简称,它是windows显示图片的基本格式。BMP 格式的图片采用位映射存储格式,除了图像深度可选外,不采用其他任何压缩, 所以,BMP文件所占用的空间很大。 注:关于图像深度概念 根据三原色原理,图像的每一点其实是由三点组成,电脑来说是红、绿、 蓝,这三点的不同亮度所呈现给用户的感觉就是不同的颜色。而所谓的深度,就 是各像素的从最暗到最亮的“刻度”范围,刻度越多,色彩控制也就越逼真,反 之就是失真。因此,32位所表示的色彩要比24位逼真。但是,深度越大,也就意 味着图像文件越大,电脑处理起来的时间越长,占用的空间也就越可观。 在保存BMP图像时,可以选择多少位色,常见的有单色位图、16色位图、24 位位图、32色位图、256色位图等。 注:16色位图,与16位位图是不同的概念! 16色位图:表示图像只能由16种颜色构成 16位位图:表示图像的深度为16位,每一位可以表示为0和1两个值,故可表 示的颜色有2的16次方种。 单色位图:图像只能由黑白两颜色构成 O S D 水 印 叠 加 功 能 1 B M P 添 加 水 印 1 . 1 B M P 格 式 图 片 概 念
256色位图:图像由256中颜色构成,这种位图也叫8位位图(2^8=256) 一个BMP文件由四个部分组成,如下所示: ● 位图文件头:这部分占用14个字节,用于保存BMP文件的类型、文件大 小和位图其实位置等信息。 ● 位图信息段:这部分占用40个字节,用于说明位图的尺寸等信息。 ● 调色板信息:调色板信息是单色、16色和256色图像文件所特有的,相对 应的调色板大小为2、16和256,调色板以4字节为单位,每4个字节存放一个颜色 值。(假设图像为8位位图,则调色板所占的空间大小为:256*4=1024个字节, 8位位图也是256色位图)。调色板信息与位图类型、颜色数的关系如下: 其中:biBitCount表示每个像素所需的位数,必须是1(单色)、4(16 色)、8(256色)或者24(真彩色)之一。故: biBitCount = 1时,8个像素占用一个字节 biBitCount = 4时,2个像素占用一个字节 biBitCount = 8时,1个像素占用一个字节 biBitCount = 24时,1个像素占用3个字节 1 . 2 B M P 格 式 分 析
● 位图数据:从这部分开始,将存储图像的原始数据。位图数据记录了位图 的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。 位图上每一个像素所占用的字节数,如上面红色部分标注所示。 注:BMP图片的原点坐标为左下角,当读取原始数据用于显示时,可以从原 点(左下角)开始读取原始图片原始数据,因为显示时是整个图片画面全部拷贝 到内存,然后再显示。若需要读取图片数据叠加到视频数据中作为水印信息,则 需要从图片的左上角开始读取图片数据,因为屏幕的原点坐标为左上角,所以拷 贝图片数据时需要从左上角开始拷贝,若还是从左下角开始拷贝,则添加的水印 会倒着。 在yuv视频数据中叠加BMP水印信息,实现方法:假设采用的BMP位图为8位 (256色)的位图,只需要将BMP图片中的位图数据添加到原始视频数据中即可, 故,首先用UE打开BMP图片,将位图文件头、位图信息头、调色板信息去掉,只 保留位图数据部分。 假设BMP图片的分辨率为96*48,则保留下来的位图数据大小为: 96*68-14-40-256*4=6528-1078=5450(字节) 注:在使用水印数据替换视频数据时,需要注意视频数据的格式(YUYV、 YUV420、UYVY等),由于我使用的水印为黑底白字,有文字的地方为白色,否则 为原始色彩,因此BMP图片中只有0x00和0xFF。在添加水印时需要忽略掉背景的 黑色,产生透明背景的效果。采用的方法是:当BMP图片中数据为0xFF时,才将 这个数据替换掉原始视频中的数据,并且只替换掉Y分量即可,若替换掉了U、V 分量,则叠加的水印将会失真。(视频中的Y、U、V分量各自占用一个字节) 字库主要分两类:点阵字库、矢量字库。 ● 点阵字库:就是把每个字符都分为16x16或者24x24个点,然后用每个点 的虚实来表示字符的轮廓,常用来作为显示字库使用,这类点阵字库最大的缺点 是不能放大,一旦放大后就会发现文字边缘的锯齿。 1 . 3 使 用 B M P 添 加 水 印 2 . 字 体 添 加 水 印 2 . 1 字 库 分 类
● 矢量字库:在矢量字库中保存的是对每一个汉字的描述信息,比如一个 笔画的起始、终止坐标,半径、弧度等。在显示、打印这一类字库时,要经过一 系列的数学运算才能输出结果,但是这类字库保存的汉字理论上可以被无线放 大,笔划轮廓任然能保持圆滑,打印时使用的字库均为此类字库。由于矢量字库 在显示时,需要经过一系列计算,所以效率不及点阵字库。 在点阵字库中,每个字节的每个位都代表字符的一个点,每个字符都由一个 矩形的点阵组成,0代表没有点,1代表有点,将0和1分别用不同的颜色画出,就 显示出了相应的字符,常见的点阵字库矩形有12x12、14x14、16x16。 点阵字库根据字节所表示点的不同分为横向矩阵和纵向矩阵,目前多数 的字库都是横向矩阵的存储方式。纵向矩阵一般是因为某些液晶采用纵向扫描显 示法,为了提高显示速度,于是便把字库矩阵做成纵向,省得在显示时还要做矩 阵转换。 对于16x16的矩阵来说,它所需要的位数为16x16=256位,因此,每个字符都 需要256/8=32个字节来表示。即每两个字节代表一行的16个点,共需要16行。显 示汉字时,只需要一次性读取32个字节,并将每两个字节为一行打印出来,即可 形成一个字符。 注:ASCII码的前32个字节(0x00~0x20)在显示中不会用到,是不可打印字 符;之后的94个字节(0x20~0x7E)会在显示中使用,是可打印字符;最后的128个 字节代表另外一组128个符号,称为extended ASCII。所以,ASCII码总共有256 个符号,8*16点阵字库占用的空间大小如下: 8*16 / 8 * 256 = 4096字节 以下以8*16点阵字库为例,说明点阵字库的使用,步骤如下: ● 生成点阵字库文件,可用以下工具生成: 点阵字库(字模)生成器.rar 1.9MB ● 打开字库文件(若字库文件以数组的形式存放在文件中,则不需这步) 2 . 2 点 阵 字 库 2 . 3 点 阵 字 库 使 用
● 计算出要打印的字符在字库文件中的偏移量(寻址) ● 将这个偏移地址的数据(16字节)读取到缓冲区中(若采用数组的形 式,字库文件已经存放在内存中,只需根据偏移量找到正确的地址,获得数据即 可) ● 显示这个缓冲区中的内容。 对于点阵字库偏移量的计算,详见2.4 在使用点阵字库时,需要先计算出字符在字库中的偏移,然后根据这个偏移 在字库中查找出对应的字符。在计算偏移量时,分为ACSII点阵和汉字点阵。 若添加的信息为常见英文字母、数字、符号等,可采用ASCII码点阵。如何 寻找字符在ASCII字库中的偏移量,采用方法如下: 点阵字库中的字符排序是符合ASCII顺序的,而每个字符长度为:len=(字符 长*字符宽)/8个字节的长度(如8*16点阵为:8*16/8=16),因此,将要打印的字 符与每个字符长度len相乘,便得到这个字符在字库中的位置了,即偏移地址, 这个位置之后的len个字节的数据就是这个字符了。(对于数组方式存放而言, 数组基地址加上这个偏移地址就是要打印字符的基地址) 如:在8x16 ASCII点阵中,字母“A”,十六进制地址是0x41,他与 16(0x10)相乘,得到0x410,这个地址就是字母“A”在ASCII码8*16点阵字库 中的地址,该地址所指向的16字节的数据便是字母“A”。 常用的汉字点阵字库是符合GB2312标准的点阵字库,如HZK16(16x16)、 HZK24(24x24)等等。在GB2312标准中对收入的汉字进行了“分区”处理,每区含 有94个汉字/符号,这种表示方法称为区位码。 计算汉字在字库中偏移量时,采用的方法叫区位码计算法。在GB2312标准 中,每个汉字由两个字节进行编码表示。其中,前一个字节为该汉字的区码,后 一个字节为该汉字的位码,区码/位码的计算方法如下: ● 区码:汉字的第一个字节-0xA0(因为汉字编码是从0xA0区开始的) 2 . 4 点 阵 字 库 偏 移 计 算 2 . 4 . 1 A C S I I 字 符 点 阵 偏 移 量 计 算 2 . 4 . 2 汉 字 点 阵 偏 移 量 计 算
● 位码:汉字的第二个字节-0xA0 所以,汉字在点阵字库中的偏移量计算如下: offset = (94*(区码-1) + (位码-1))*nBytes 其中: ● 区码/位码-1是因为数组是以0为开始,而区码/位码是以1为开始的。 ● (94*(区码-1) + (位码-1))是一个汉字字模占用的字节数 ● nBytes是一个汉字显示需要的字节数,如8x16字库中,需要的字节数 为:8*16/8 = 16个字节。 在项目中使用点阵字库叠加OSD信息时,遇到叠加信息为中英文混合字符 串,如:“中文测试ABC”。这类OSD信息的显示,首先需要从输入的字符串中判 断出当前的字符是中文还是其他,对于中文则采用GB2312字库显示;其他字符则 采用ASCII码字库进行显示。 判断当前字符是中文字符还是其他字符的方法是:将当前字符与0xA0进行比 较,大于0xA0为中文字符。否则,为其他字符,如下: 附件代码中的OSD显示函数中,含有对输入字符类别判断部分。 osd.cpp 12.97KB osd_font.h 4.6MB 2 . 5 中 英 文 混 合 字 符 串 处 理
分享到:
收藏