提词器软件的四种实现方式
2014-07-07杜歆文
杜歆文
(苏州广播电视总台,江苏 苏州 215006)
提词器软件的四种实现方式
杜歆文
(苏州广播电视总台,江苏 苏州 215006)
随着应用和技术的发展,台内原有的提词器软件渐渐不能满足使用需求,因此需要对其进行改进。在实际过程中尝试了许多方法,介绍了4种提词器软件的实现方式,剖析其原理,介绍了实现方法,提供部分代码,并对4种方式的优劣进行比较,同时为平板设备上的提词器软件做准备。
提词器;字体;镜像;翻转;Windows呈现基础
提词器是通过一个高亮度的显示器件显示文稿内容,并将显示内容反射到摄像机镜头前的一块呈45°的专用镀膜玻璃上,把台词反射出来,使得演讲者在看演讲词的同时,也能面对摄像机。由于镜面反射,要想看到正确的图像,显示器必须显示镜像图像。苏州台现有提词器软件是十多年前自行开发的,当时CRT是主流显示器,对于CRT显示器实现镜像显示很容易,只需要将行偏转输出信号反接即可。在LCD显示器时代,通过硬件实现镜像输出就比较麻烦,只能通过更换屏幕控制电路完成。这不是一种很经济的实现方法,随着设备老化、备件减少,苏州台决定更新提词器软件。
提词器软件结构很简单,打开或粘贴文本文件,以镜像方式全屏输出。虽然有厂商提供成品,但还是决定自行设计开发,在开发过程中,研究并尝试了一些方法。
1 方式一:图像翻转
这种方法是常规解决方法,根据文字内容生成一张图片,显示图片并使其滚动。
提词器通常至少需要用到显卡的2路输出:1路输出接操作屏幕,以下简称主屏;1路输出连接到摄像机前的屏幕,以下简称副屏。在主屏文本框编辑内容完成后,生成一张图片临时文件,使图片在副屏显示,并控制其上下移动。由于玻璃的反射,需要副屏左右颠倒镜像显示。对于图片实现镜像较为容易,左右像素交换即可。
2 方式二:字体翻转
这是一种特别的处理方法。提词器副屏的显示是通过把实际文字左右镜像,因此可以把每个文字都镜像显示,同时把每行文字从右向左显示。
处理方法如下:
1)生成镜像字体
选择需要做镜像的字体,比如说“仿宋”,从“C:WindowsFonts”文件夹中复制出来,利用Fontogra⁃pher,FontCreator或者AsiaFontStudio等软件,打开字库,可以进行水平镜像或者垂直镜像,这里需要水平镜像,完成变换后生成新的字库。
2)字体格式转换
由于生成的字体格式是otf格式,而visualstudio中只能使用ttf格式的字体,需要进行格式转换。可以使用FontForge这类软件进行格式转换,也有不少网站提供在线转换的服务。
将转换后的字体文件复制进“C:WindowsFonts”文件夹中即完成镜像字体的安装,可以在编程环境中进行使用。部分程序可能在重启后生效。
3)自动折行转成硬回车
完成字体转换后还需要将文本从右向左显示。文本框载入文本后会按照宽度自动换行,需要取出每一行将其逆序显示,因此需要将自动折行转换成回车换行,以读取每行文字。参考以下代码(C#):
5)滚动显示
到目前为止,已经完成了文本的镜像显示,只需要加入定时器使文本框滚动即可。
3 方式三:文本框翻转
WPF(WindowsPresentationFoundation)是微软推出的基于WindowsVista的用户界面框架,是新一代图形系统[1-3],运行在.NETFramework3.0架构下,为用户界面、2D/3D图形、文档和媒体提供统一的描述和操作方法。借助WPF,可以轻松完成很多以前很难实现的视觉效果。
在WPF中可以使用TranslateTransform,RotateT⁃ransform,ScaleTransform等进行几何变换,但要使用更底层的MatrixTransform(矩阵变换)来进行更复杂的复合变换。
MatrixTransform矩阵变换,其实就是其他变形类的底层实现代码,其他的类都是基于这个类的扩展,使用户可以更加简单方便地应用。各类默认值参考表1。
表1 各类默认值
在该方法中,至少需要2个RichTextBox,其中1个正常显示用于监看,1个镜像显示用于提词器,两者宽高比应相同。由于RichTextBox缩放后,内容字体大小不会一起缩放,因此,需要按比例设置2个文本框内文字大小,以保证两者内容换行位置相同。
镜像操作参考以下代码(xaml):
该段代码表示将宽1024、高768的RichTextBox向左翻转镜像,再向右平移1024像素保持在屏幕中间。
4 方式四:VisualBrush类
在WPF中,微软提供了VisualBrush类。Visual⁃Brush.Visual属性获取或设置画笔的内容,使用Visual绘制区域。指定VisualBrush的Visual内容有两种方法:创建一个新Visual,并使用它来设置VisualBrush的Visual属性;或使用现有Visual,它将创建目标Visual的重复图像,然后可以使用VisualBrush来创建一些有趣的效果,例如反射和放大。
为VisualBrush定义一个新的Visual,该Visual是一个UIElement(如面板或控件),此处为监看窗口的Rich⁃TextBox,把VisualBrush填充区域等比例设置为提词器显示屏全屏大小,Visual将RichTextBox绘制填充至此区域。
与上述TranslateTransform类似,VisualBrush类提供了一个继承自Brush的Transform属性,获取或设置应用于画笔的变换,同样应用矩阵变化,可实现镜像翻转。参考代码如下(xaml):
也可以如方法三所述,采用MatrixTransform矩阵变换进行镜像翻转。参考代码如下(xaml):
5 滚动的实现
提词器的使用过程中,仅仅镜像显示是不够的,还需要控制显示内容向上向下滚动。这里采用了一种比较简单的方法。
首先创造一个定时器,设置时间刻度之间的时间段大小,即多长时间发出一次。然后为该定时器绑定一个事件,超过定时器间隔时发生。在该事件中,定义一个递增变量,让RichTextBox滚动到该变量位置。参考代码如下(C#):
通过调整时间间隔m_timer.Interval和pos变量每次递增的大小,控制RichTextBox滚动速度,并达到一个平滑滚动状态。
6 总结
本文介绍了4种提词器软件的实现方法,4种方法各有优劣。方法一图像翻转是传统的处理方法,优点在于实现方便,滚动平滑,但一旦文字长度太长,生成图片的时间会比较长。方法二字体翻转另辟蹊径,没有借助语言特性,任何编程语言都能实现该功能,但实验发现字体处理后显示效果差强人意。方法三文本框翻转利用了微软强大的WPF,WPF在界面处理上很有帮助,这种方法实现效率高、效果好,但由于监看窗口和提词器窗口是2个RichTextBox,大小不同,里面的文字大小需要等比缩放才能保证监看与实际显示相同,但实验过程中发现这点很难控制,文字宽度和字号不是严格的比例关系,会发生2个窗口换行不一致的情况。方法四使用VisualBrush,同样利用WPF,由于提词器窗口是监看窗口的镜像,所以克服了方法三的缺点,实验中表现较好,载入数万甚至数十万的大段文字速度也较快,只是文字数量过多时,刚开始滚动会有些不流畅,但考虑到实际使用时这种极限情况几乎不会发生,所以可以忽略不计。
另外,值得一提的是现在越来越多的播音主持发生在演播室外,所以需要考虑一种便携提词器设备,平板PC就是一个很好的载体。微软发布的WindowsRT平板应用程序基于XAML和C#编写,和WPF程序有很大的相似性,只需要对部分界面和功能稍作修改,就可以移植到WindowsRT平板PC上,成为便携式提词器。
[1]WALTHERS.ASP.NET3.5揭秘[M].北京:人民邮电出版社,2009.
[2]赛尔斯,格里菲思.WPF编程[M].金璐,夏明才,译.北京:机械工业出版社,2009.
[3]ANDRADEC,LIVERMORES,MAYERSM.WPF高级编程[M].王德才,吴明飞,译.北京:清华大学出版社,2008.
TN948
B
��健男
2013-07-25
【本文献信息】杜歆文.提词器软件的四种实现方式[J].电视技术,2014,38(2).