在工作中遇到这样一个问题,在实时监视的视频显示中需要在视频中显示当前时间,通道名等额外信息,无论信息内容在视频画面上采用何种颜色显示,当信息显示区域背景的视频画面的颜色正好与显示信息内容的颜色一致或差不多相似时,这个时候,很难看清显示的内容,尽管这种情况出现的概率并不大,但可能性仍然存在,解决这个问题最好的方法是在信息文字的外围加上一层和文字颜色不一样的外边。下面我们以文字为白色,外围加黑边为例来分析这个问题。

以下分析基于在windows操作系统的PC机上实现。

如何在白色文字的外围加裹一层黑边,目前我知道的有两种方式。

1.通过获得windows显示设备句柄,利用windows的textout()函数可以直接裹上黑边。具体代码如下:

bool drawText(CDC *pDC,

LPCTSTR lpszText,

const CRect& rctDraw,

UINT nFormat,

COLORREF clrText,

COLORREF clrBack)

{

ASSERT(pDC != NULL);

if (pDC->GetSafeHdc() == NULL) return false;

COLORREF oldColor = pDC->GetTextColor();

int      oldBkMod = pDC->SetBkMode(TRANSPARENT);

CRect rect = rctDraw;

pDC->SetTextColor(clrBack);

rect.OffsetRect(-1, -1); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect( 1,  0); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect( 1,  0); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect( 0,  1); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect( 0,  1); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect(-1,  0); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect(-1,  0); pDC->DrawText(lpszText, rect, nFormat);

rect.OffsetRect( 0, -1); pDC->DrawText(lpszText, rect, nFormat);

pDC->SetTextColor(clrText);

rect.OffsetRect( 1,  0); pDC->DrawText(lpszText, rect, nFormat);

pDC->SetBkMode(oldBkMod);

pDC->SetTextColor(oldColor);

return true;

}

2.通过已获取的点阵字符库,然后构建一个新的包含黑边的字符库结构,显示时,对这个新的字符库结构显示。

以16*16的点阵字符库为例,一个汉字需要16*16位即32个字节来表示,如下图

在32个字节里存取的都是字模显示的位信息,2个字节表示一行,按位从左到右显示,0表示无色,1表示文字色,一共16行。

为了在字的外围加一层黑边,需要定义一个新的数据结构,用两个位来保存点阵信息,00表示无色,11表示文字色,01表示边框色,这样考虑到为了在字的边缘处也可能有黑边,新的字符矩阵应为18*18,其中两个位表示一个点阵信息,这样每一行需要18*2位,为了方便存取,每一行用5个字节表示,从左到右按位填充信息,多余位补0。

具体算法思路:

将含单色信息的字符模数据展开到内存,然后第一次逐行扫描点,凡是扫到某点位文字色,那么在加黑边后,新的数据结构中,其周围8个点,只有两种情况,一种是黑边色点,一种是文字色点,暂时不去理会它是否文字色点,将其周围8个点一律设为黑边色点,其自身设为文字色点,这样一次扫描完所有点后,显然在新的数据结构中,有很多文字点被设为了黑边色点,这样需要再对单色信息的字符模数据再扫描一遍,如扫到点为文字色,将新的数据结构中对应的点调为文字色,这样就将上一次扫描中本是文字色点却设为黑边色点的所有点信息全部调整过来了。

具体源码如下:

void AddShadowToZM(BYTE *pZM,int nWidth,int nHeight,BYTE **ppShadowZM)

{

if(pZM == NULL)

{

return;

}

if(*ppShadowZM != NULL)

{

delete []*ppShadowZM;

}

//由于需要加上黑边,考虑用两个比特位来表示一位象素,00表示无象素显示,01表示该象素为黑边象素,11表示该象素为文字象素

//同时考虑到外围需要加一层,在宽度上需要增加4个比特位,和位图对应从左至右,最前两个比特位对应位图左上角原点

//在高度上增加两行

*ppShadowZM = new BYTE[(nWidth*2+1)*(nHeight+2)];

memset(*ppShadowZM,0,(nWidth*2+1)*(nHeight+2));

int i,j,k;

//SHADOW

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

{

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

{

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

{

if((pZM[i*nWidth+j] >> (7-k))&0x01)

{

//TRACE("0");

//如果某一位为1,将其四周象素全部置为01,表示为加黑边

for(int m = 0;m < 3;m++)

{

for(int n = 0;n < 3;n++)

{

(*ppShadowZM)[(i+m)*(nWidth*2+1)+(j*8+k+n)*2/8] |= 1<

//TRACE("2");

}

}

}

else

{

//TRACE(" ");

}

}

}

//TRACE("/n");

}

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

{

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

{

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

{

if((pZM[i*nWidth+j] >> (7-k))&0x01)

{

(*ppShadowZM)[(i+1)*(nWidth*2+1)+(j*8+k+1)*2/8] |= 3<

//TRACE("0");

}

else

{

//TRACE("*");

}

}

}

}

}

在获取了新的点阵数据结构后,可以根据显示的要求将其显示在视频画面上。

上述的第二种方法,虽然比较麻烦,但在获取了点阵字符模数据文件后,这种方法更具普遍性。关于点阵字符模数据的获取将另行讨论。

html给文字加黑色边框,如何给显示文字加一层黑色边框相关推荐

  1. vue 项目在加载完成之前,显示预置加载动画

    vue 项目在加载完成之前,显示预置加载动画 自己有一个日记项目,由于服务器带宽很小1MB,在加载之前页面中显示是空白的,就想给它加个前置的动画,这个用户体验更好. 一.实现 1. 定义项目入口 如果 ...

  2. 在css的框中打文字,css 边框上如何写入文字?

    方法一: 1.首先,打开html编辑器,新建html文件,例如:index.html. 2.在index.html中的 标签中,输入html代码:. 文字 3.浏览器运行index.html页面,此时 ...

  3. OpenGL显示文字

    阅读这篇文章前,可以先看一下这个文字显示系列的其他文章,了解一些字符编码,字体相关的知识:https://blog.csdn.net/wlk1229/article/category/9008450 ...

  4. opengl学习之显示文字

    本课我们来谈谈如何显示文字. OpenGL并没有直接提供显示文字的功能,并且,OpenGL也没有自带专门的字库.因此,要显示文字,就必须依赖操作系统所提供的功能了. 各种流行的图形操作系统,例如Win ...

  5. OLED显示文字,字母,数字

    OLED显示文字,字母和数字 前提:根据数据手册编写好OLED的IIC时序程序,有发送命令和发送数据的函数,OLED初始化后设置页模式,能成功显示一个点或者直线后再尝试显示文字,字母和数字 取模软件的 ...

  6. wps隐藏文字和显示文字

    wps的doc可以实现这个功能,Excel目前不可以实现.office同理. 文章目录 1.隐藏文字 步骤: 效果: 2.显示文字: 步骤: 效果: 3. [拓展:隐藏表格中的文字]: 步骤: 效果如 ...

  7. bootstrap 文字加边框_word文档怎么加边框和底纹-给文档化个妆

    ​word,不但可以给文字或者段落添加边框和底纹,也可以给整个页面添加边框或底纹,我简单的设置了一下,先看看效果怎么样,别说我设置的难看哦. 1.点边框和底纹按钮,找到边框和底纹,点开,进入边框和底纹 ...

  8. el-drawer点击的时候为什么有边框_剪映教学之视频拍摄加剪辑【一】:出视频上下黑色边框模糊效果,视频广告配音...

    抖音小视频已经成为风靡全国的一个app了,很多人都喜欢看抖音来打发时间,而经常看小视频的应该都见到过这种现象,就是有一些小视频我们在观看的时候,发现这个小视频的上下都有黑色边框或者模糊的效果,实际这都 ...

  9. css文字背景虚化,通过实现背景模糊、文字颜色流光渐变、边框扩展等效果学习transition、transform、@keyframes等属性及伪元素的使用...

    百度前端技术学院2017于2月24日开始进行,一共有6个学院可供学习,分别是小薇学院(html/css基础).斌斌学院(js基础).耀耀学院(小游戏/交互).商业平台学院(web/ios/androi ...

最新文章

  1. 【MM】计划交货成本(Delivery Costs)
  2. c#中mysql远程连接方法及实例
  3. [html] Standards模式和Quirks模式有什么区别?
  4. [BZOJ 3647]
  5. UI设计素材资源|艺术感加分背景
  6. 怎样取消shutdown关机命令?-shutdown命令的使用解析
  7. http://www.uupoop.com/ps/
  8. 如何在TP-LINk WR340G中禁用端口
  9. PICKIT3 WIN10无法识别问题
  10. Jpg格式如何变成gif动图?仅需三步快速合成gif
  11. 磨刀不误砍柴工-流程梳理
  12. igh+preempt_rt主战搭建
  13. Django(14)-应用及分布式路由
  14. 英语专业,不想做老师,还能做什么工作?
  15. git获取ssh密钥
  16. PopupWindow
  17. EasyNVR网页摄像机直播方案H5前端构建之:如何播放HLS
  18. 请问nj文件如何用html的解析,nj.renderH
  19. Python实现利用MMR提取自动摘要
  20. IDEA导入主题皮肤

热门文章

  1. optee中的thread_vector_table线程向量表
  2. 软件构造的视图与质量指标
  3. python二级考time库吗_学python第十七节:time库的学习
  4. (1)段寄存器属性探测
  5. C#中base64编码与解码
  6. 160个Crackme003之4C大法详解
  7. MySQL LEFT/RIGHT JOIN:外连接查询
  8. 【PAT乙级】1065 单身狗 (25 分)
  9. 消息发送 C语言版和 Visual Basic Script版
  10. C语言插入排序(解析)