杜歆文
(蘇州廣播電視總臺,江蘇 蘇州 215006)
提詞器軟件的四種實現方式
杜歆文
(蘇州廣播電視總臺,江蘇 蘇州 215006)
隨著應用和技術的發展,臺內原有的提詞器軟件漸漸不能滿足使用需求,因此需要對其進行改進。在實際過程中嘗試了許多方法,介紹了4種提詞器軟件的實現方式,剖析其原理,介紹了實現方法,提供部分代碼,并對4種方式的優劣進行比較,同時為平板設備上的提詞器軟件做準備。
提詞器;字體;鏡像;翻轉;Windows呈現基礎
提詞器是通過一個高亮度的顯示器件顯示文稿內容,并將顯示內容反射到攝像機鏡頭前的一塊呈45°的專用鍍膜玻璃上,把臺詞反射出來,使得演講者在看演講詞的同時,也能面對攝像機。由于鏡面反射,要想看到正確的圖像,顯示器必須顯示鏡像圖像。蘇州臺現有提詞器軟件是十多年前自行開發的,當時CRT是主流顯示器,對于CRT顯示器實現鏡像顯示很容易,只需要將行偏轉輸出信號反接即可。在LCD顯示器時代,通過硬件實現鏡像輸出就比較麻煩,只能通過更換屏幕控制電路完成。這不是一種很經濟的實現方法,隨著設備老化、備件減少,蘇州臺決定更新提詞器軟件。
提詞器軟件結構很簡單,打開或粘貼文本文件,以鏡像方式全屏輸出。雖然有廠商提供成品,但還是決定自行設計開發,在開發過程中,研究并嘗試了一些方法。
這種方法是常規解決方法,根據文字內容生成一張圖片,顯示圖片并使其滾動。
提詞器通常至少需要用到顯卡的2路輸出:1路輸出接操作屏幕,以下簡稱主屏;1路輸出連接到攝像機前的屏幕,以下簡稱副屏。在主屏文本框編輯內容完成后,生成一張圖片臨時文件,使圖片在副屏顯示,并控制其上下移動。由于玻璃的反射,需要副屏左右顛倒鏡像顯示。對于圖片實現鏡像較為容易,左右像素交換即可。
這是一種特別的處理方法。提詞器副屏的顯示是通過把實際文字左右鏡像,因此可以把每個文字都鏡像顯示,同時把每行文字從右向左顯示。
處理方法如下:
1)生成鏡像字體
選擇需要做鏡像的字體,比如說“仿宋”,從“C:WindowsFonts”文件夾中復制出來,利用Fontogra?pher,FontCreator或者AsiaFontStudio等軟件,打開字庫,可以進行水平鏡像或者垂直鏡像,這里需要水平鏡像,完成變換后生成新的字庫。
2)字體格式轉換
由于生成的字體格式是otf格式,而visualstudio中只能使用ttf格式的字體,需要進行格式轉換。可以使用FontForge這類軟件進行格式轉換,也有不少網站提供在線轉換的服務。
將轉換后的字體文件復制進“C:WindowsFonts”文件夾中即完成鏡像字體的安裝,可以在編程環境中進行使用。部分程序可能在重啟后生效。
3)自動折行轉成硬回車
完成字體轉換后還需要將文本從右向左顯示。文本框載入文本后會按照寬度自動換行,需要取出每一行將其逆序顯示,因此需要將自動折行轉換成回車換行,以讀取每行文字。參考以下代碼(C#):


5)滾動顯示
到目前為止,已經完成了文本的鏡像顯示,只需要加入定時器使文本框滾動即可。
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像素保持在屏幕中間。
在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):

提詞器的使用過程中,僅僅鏡像顯示是不夠的,還需要控制顯示內容向上向下滾動。這里采用了一種比較簡單的方法。
首先創造一個定時器,設置時間刻度之間的時間段大小,即多長時間發出一次。然后為該定時器綁定一個事件,超過定時器間隔時發生。在該事件中,定義一個遞增變量,讓RichTextBox滾動到該變量位置。參考代碼如下(C#):

通過調整時間間隔m_timer.Interval和pos變量每次遞增的大小,控制RichTextBox滾動速度,并達到一個平滑滾動狀態。
本文介紹了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).