預告了很久的幾篇專欄博文一直沒有整理好,主要緣由是早前但願搭建的WML服務器計劃遇到了問題。起初覺得參照DCMTK的官方文檔wwwapp.txt結合前兩天搭建的WAMP服務器能夠順利的實現WML服務,藉此就能夠同時完成WEB PACS系列以及搭建Dicom WML服務器的兩篇博文。但是在實際部署過程當中發現了幾個嚴重的問題,一時沒法解決。可是在搜索解決方案的時候,偶然間找到了在DCMTK論壇上貼出來的用PHP對DCMTK工具包封裝的文章。所以此篇博文在記錄搭建WML遇到的問題的同時,主要想向你們介紹一下這個簡單的封裝DCMTK工具包的PHP類,並在前期搭建的WAMP服務器上給出示範實例。(PS:也但願知道如何解決該問題的大神趕忙現身)php
按照DCMTK官方文檔wwwapp.txt文件(http://support.dcmtk.org/docs/file_wwwapp.html)的說明,搭建DICOM Basic Worklist Management服務的前期準備工做已經基本完成,前述的WEB PACS平臺已經可以順利提供HTTPD、CGI以及Perl解析的功能(具體可參見博文中給出的Perl示例:http://blog.csdn.net/zssureqh/article/details/40516745)。可是按照wwwapp.txt文檔指示拷貝wwwapps目錄下的可執行文件(例如preplock、readoviw、readwlst、writwlst)時,並未在編譯後的工程中找到,只看到了相應的.cc源碼文件。html
搜索相關資料後,發現柳北風兒前輩此前也遇到過該問題,並向OFFIS的相關維護人員進行過諮詢。前輩的說明博文地址是:http://qimo601.iteye.com/blog/1701026,OFFIS論壇的討論地址是:http://forum.dcmtk.org/viewtopic.php?f=1&t=723&hilit=wwwapp.txt。linux
按照上述的說明,確信應該是在編譯DCMTK源碼中間的某個環節出現了問題,致使本應該順利生成的幾個exe文件丟失。官方論壇中的討論是針對Linux環境下利用make工具來編譯的狀況,該環境下在利用make安裝的時候由make distclean指令來控制preplock、readoviw、readwlst、writwlst等可執行文件的清除。可是在Windows環境下用的是CMake來生成與VS對應的sln文件,打開DCMTK.sln解決方案後並未找到如何設置才能編譯生成上述可執行文件,並且按照柳前輩的說法,即便編譯成功,在Win7環境下一樣缺乏一個preplock.exe文件。至此該問題的解決就終止了,到發文時刻還未找到很好的解決方法。git
在瀏覽OFFIS論壇,尋找上述問題的解決方案時,無心點開了論壇中的「Third-Party DCMTK Applications」分支,以下圖所示,該分論壇中介紹了衆多DCMTK相關的應用開發,其中有一項叫作「PHP DICOM Class「。程序員
其中做者Vedicveko給出了PHP Dicom Class類的設計初衷以及詳細的使用說明,說明文檔網址爲:http://deanvaughan.org/wordpress/dicom-php-class/。github
下載源碼(https://github.com/vedicveko/class_dicom.php/zipball/master)後,打開class_dicom.php核心類文件,能夠看出做者經過使用PHP中的exec命令來對DCMTK對應的工具包進行了封裝,藉助於PHP語言的優點使得DCMTK更易於網絡化應用。Apache網絡服務器與PHP之間的調用能夠直接利用咱們前面搭建的簡易WEB PACS平臺(該平臺對於PHP的調用經過FastCGI來實現),而後經過結合PHP DICOM Class能夠實現對dcm文件的大多數操做,具體的實現以下。編程
第一,將DCMTK編譯後的工具包統一放到指定位置,例如個人本機地址爲:c:\dcmtk\bin,修改class_dicom.php文件中的以下代碼,將TOOLKIT_DIR指向本機工具包目錄c:\dcmtk\bin。windows
define('TOOLKIT_DIR', 'C:/dcmtk/bin'); // CHANGE THIS IF YOU HAVE DCMTK INSTALLED SOMEWHERE ELSE瀏覽器
第二,藉助前面搭建的WAMP服務,在網站服務根目錄(我本機爲c:\wamp\www\)下新建class_dicom_php目錄,將下載的PHP DICOM Class源碼文件直接拷貝到class_dicom_php目錄下,以下圖所示:服務器
第三,開啓wamp server服務,在瀏覽器中輸入http://localhost/class_dicom_php/examples/get_tags.php,進行測試,正常的話會輸出dean.dcm文件的Tags標籤信息,以下圖所示:
如上所示瀏覽器中看到的結果與利用dcmdump.exe工具查看的結果一致,說明PHP DICOM Class已經順利的安裝到了WEB PACS平臺中。
【注】:在實際運行過程當中可能會出現錯誤,緣由是get_tags.php中使用的是$argv命令行變量來得到具體的dcm文件路徑的,可是在WEB PACS中咱們只能經過GET或者POST方式傳遞參數到php腳本,所以可修改get_tags.php中的參數獲取方式,或者直接將測試文件dean.dcm寫入到文件路徑變量中,以下所示:
$file = (isset($argv[1]) ? $argv[1] : 'dean.dcm');
#原來代碼爲:$file = (isset($argv[1]) ? $argv[1] : ' ');
修改後再次在瀏覽器中輸入http://localhost/class_dicom_php/examples/get_tags.php,就會順利獲得上述結果。
雖然PHP DICOM Class只是簡單的調用了DCMTK工具包來實現PHP對DICOM文件的操做,可是因爲DCMTK工具包的強大,在目前咱們簡易的WEB PACS平臺的併發數不大的狀況下,能夠嘗試直接利用PHP DICOM Class來實現前篇博文中將DCM文件的圖像信息輸出到瀏覽器的功能。
查看class_dicom.php,看到其中dicom_convert類中有關於JPEG到DCM的自由雙向變換,其源碼中用到的是DCMTK工具包中的dcmj2pnm,查看dcmj2pnm的幫助文檔可知,該工具也可實現DCM到bmp文件的轉換,所以決定對class_dicom.php中的dicom_convert類進行擴展,添加dcm_to_bmp()函數,具體代碼以下:
dcm_to_bmp()不一樣於dcm_to_jpg()的主要地方是dcmj2pnm的指令參數不一樣,bmp文件用到的是+ob參數,dcmj2pnm自己能夠生成多種格式的bmp圖像,以下圖所示:
固然也能夠經過識別dcm具體的圖像標籤來自動設定保存的bmp格式,在自適應時刻用到的主要標籤以下圖所示:
編寫dcm_to_bmp的測試php,代碼以下:
在利用dcmj2pnm將dcm轉換成bmp文件後,就能夠直接利用前面博文中PHP輸出圖像到瀏覽器的代碼來輸出結果,在瀏覽器中輸入:http://localhost/class_dicom_php/examples/dcm_to_bmp.php,順利獲得dean.dcm測試文件的圖像信息,以下圖所示:
至此,利用PHP DICOM Class快速便捷地實現了將dcm文件的圖像信息輸出到瀏覽器的功能。
【注】:在上述dcm_to_bmp.php測試文件中須要將#system("ls -lsh $file*");語句註釋掉,不然在windows的WAMP環境下會出現問題。
原來只是利用OFFIS的論壇(http://forum.dcmtk.org/index.php)來搜索使用DCMTK過程當中遇到的各類錯誤,歷來沒有仔細全面的瀏覽過OFFIS論壇的各個部分,經過今天的親身經歷,發如今OFFIS論壇的DCMTK項目下的【Third-Party DCMTK Applications】部分也是一個知識寶藏,裏面包含了各類牛人利用DCMTK開發的工具,大多都是開源的,相關文檔也很詳細,之後能夠做爲重點學習的資料。
下面給出幾個我以爲很值得學習的連接,供你們參考:
利用PHP Skel結合DCMTK開發WEB PACS應用
利用DCMTK搭建WML服務器利用Oracle直接操做DICOM數據
C#的異步編程模式在fo-dicom中的應用
VMWare三種網絡鏈接模式的實際測試