php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...
背景:
預(yù)告了好久的幾篇專欄博文一直沒有整理好,主要原因是早前希望搭建的WML服務(wù)器計(jì)劃遇到了問題。起初以為參照DCMTK的官方文檔wwwapp.txt結(jié)合前兩天搭建的WAMP服務(wù)器可以順利的實(shí)現(xiàn)WML服務(wù),借此就可以同時(shí)完成WEB PACS系列以及搭建Dicom WML服務(wù)器的兩篇博文。可是在實(shí)際部署過程中發(fā)現(xiàn)了幾個(gè)嚴(yán)重的問題,一時(shí)無法解決。但是在搜索解決方案的時(shí)候,偶然間找到了在DCMTK論壇上貼出來的用PHP對DCMTK工具包封裝的文章。因此此篇博文在記錄搭建WML遇到的問題的同時(shí),主要想向大家介紹一下這個(gè)簡單的封裝DCMTK工具包的PHP類,并在前期搭建的WAMP服務(wù)器上給出示范實(shí)例。(PS:也希望知道如何解決該問題的大神趕緊現(xiàn)身)
問題:
按照DCMTK官方文檔wwwapp.txt文件(http://support.dcmtk.org/docs/file_wwwapp.html)的說明,搭建DICOM Basic Worklist
Management服務(wù)的前期準(zhǔn)備工作已經(jīng)基本完成,前述的WEB PACS平臺已經(jīng)能夠順利提供HTTPD、CGI以及Perl解析的功能(具體可參見博文中給出的Perl示例:http://blog.csdn.net/zssureqh/article/details/40516745)。但是按照wwwapp.txt文檔指示拷貝wwwapps目錄下的可執(zhí)行文件(例如preplock、readoviw、readwlst、writwlst)時(shí),并未在編譯后的工程中找到,只看到了相應(yīng)的.cc源碼文件。
wwwapp安裝的相關(guān)資料:
搜索相關(guān)資料后,發(fā)現(xiàn)柳北風(fēng)兒前輩此前也遇到過該問題,并向OFFIS的相關(guān)維護(hù)人員進(jìn)行過咨詢。前輩的說明博文地址是:http://qimo601.iteye.com/blog/1701026,OFFIS論壇的討論地址是:http://forum.dcmtk.org/viewtopic.php?f=1&t=723&hilit=wwwapp.txt。
嘗試解決:
按照上述的說明,確信應(yīng)該是在編譯DCMTK源碼中間的某個(gè)環(huán)節(jié)出現(xiàn)了問題,導(dǎo)致本應(yīng)該順利生成的幾個(gè)exe文件丟失。官方論壇中的討論是針對Linux環(huán)境下利用make工具來編譯的情況,該環(huán)境下在利用make安裝的時(shí)候由make distclean指令來控制preplock、readoviw、readwlst、writwlst等可執(zhí)行文件的清除。但是在Windows環(huán)境下用的是CMake來生成與VS對應(yīng)的sln文件,打開DCMTK.sln解決方案后并未找到如何設(shè)置才能編譯生成上述可執(zhí)行文件,而且按照柳前輩的說法,即使編譯成功,在Win7環(huán)境下同樣缺少一個(gè)preplock.exe文件。至此該問題的解決就終止了,到發(fā)文時(shí)刻還未找到很好的解決方法。
PHP DICOM Class
在瀏覽OFFIS論壇,尋找上述問題的解決方案時(shí),無意點(diǎn)開了論壇中的“Third-Party DCMTK Applications”分支,如下圖所示,該分論壇中介紹了眾多DCMTK相關(guān)的應(yīng)用開發(fā),其中有一項(xiàng)叫做“PHP DICOM Class“。
其中作者Vedicveko給出了PHP Dicom Class類的設(shè)計(jì)初衷以及詳細(xì)的使用說明,說明文檔網(wǎng)址為:http://deanvaughan.org/wordpress/dicom-php-class/。
下載源碼(https://github.com/vedicveko/class_dicom.php/zipball/master)后,打開class_dicom.php核心類文件,可以看出作者通過使用PHP中的exec命令來對DCMTK對應(yīng)的工具包進(jìn)行了封裝,借助于PHP語言的優(yōu)勢使得DCMTK更易于網(wǎng)絡(luò)化應(yīng)用。Apache網(wǎng)絡(luò)服務(wù)器與PHP之間的調(diào)用可以直接利用我們前面搭建的簡易WEB
PACS平臺(該平臺對于PHP的調(diào)用通過FastCGI來實(shí)現(xiàn)),然后通過結(jié)合PHP DICOM Class可以實(shí)現(xiàn)對dcm文件的大多數(shù)操作,具體的實(shí)現(xiàn)如下。
PHP DICOM Class的安裝:
第一,將DCMTK編譯后的工具包統(tǒng)一放到指定位置,例如我的本機(jī)地址為:c:\dcmtk\bin,修改class_dicom.php文件中的如下代碼,將TOOLKIT_DIR指向本機(jī)工具包目錄c:\dcmtk\bin。
define(‘TOOLKIT_DIR’, ‘C:/dcmtk/bin’); // CHANGE THIS IF YOU HAVE DCMTK INSTALLED SOMEWHERE ELSE
第二,借助前面搭建的WAMP服務(wù),在網(wǎng)站服務(wù)根目錄(我本機(jī)為c:\wamp\www\)下新建class_dicom_php目錄,將下載的PHP DICOM Class源碼文件直接拷貝到class_dicom_php目錄下,如下圖所示:
第三,開啟wamp server服務(wù),在瀏覽器中輸入http://localhost/class_dicom_php/examples/get_tags.php,進(jìn)行測試,正常的話會(huì)輸出dean.dcm文件的Tags標(biāo)簽信息,如下圖所示:
如上所示瀏覽器中看到的結(jié)果與利用dcmdump.exe工具查看的結(jié)果一致,說明PHP DICOM Class已經(jīng)順利的安裝到了WEB PACS平臺中。
【注】:在實(shí)際運(yùn)行過程中可能會(huì)出現(xiàn)錯(cuò)誤,原因是get_tags.php中使用的是$argv命令行變量來獲得具體的dcm文件路徑的,但是在WEB PACS中我們只能通過GET或者POST方式傳遞參數(shù)到php腳本,因此可修改get_tags.php中的參數(shù)獲取方式,或者直接將測試文件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,就會(huì)順利得到上述結(jié)果。
示例:向?yàn)g覽器輸出DCM圖像數(shù)據(jù)
1)添加dcm_to_bmp()函數(shù):
雖然PHP DICOM Class只是簡單的調(diào)用了DCMTK工具包來實(shí)現(xiàn)PHP對DICOM文件的操作,但是由于DCMTK工具包的強(qiáng)大,在目前我們簡易的WEB PACS平臺的并發(fā)數(shù)不大的情況下,可以嘗試直接利用PHP DICOM Class來實(shí)現(xiàn)前篇博文中將DCM文件的圖像信息輸出到瀏覽器的功能。
查看class_dicom.php,看到其中dicom_convert類中有關(guān)于JPEG到DCM的自由雙向變換,其源碼中用到的是DCMTK工具包中的dcmj2pnm,查看dcmj2pnm的幫助文檔可知,該工具也可實(shí)現(xiàn)DCM到bmp文件的轉(zhuǎn)換,因此決定對class_dicom.php中的dicom_convert類進(jìn)行擴(kuò)展,添加dcm_to_bmp()函數(shù),具體代碼如下:
### zssure 20141104
function dcm_to_bmp() {
$filesize = 0;
$this->jpg_file = $this->file . ‘.bmp’;
$convert_cmd = BIN_DCMJ2PNM . ” +ob ” . “\”” . $this->file . “\” \”” . $this->jpg_file . “\””;
$out = Execute($convert_cmd);
if(file_exists($this->jpg_file)) {
$filesize = filesize($this->jpg_file);
}
return($this->jpg_file);
}
dcm_to_bmp()不同于dcm_to_jpg()的主要地方是dcmj2pnm的指令參數(shù)不同,bmp文件用到的是+ob參數(shù),dcmj2pnm本身可以生成多種格式的bmp圖像,如下圖所示:
當(dāng)然也可以通過識別dcm具體的圖像標(biāo)簽來自動(dòng)設(shè)定保存的bmp格式,在自適應(yīng)時(shí)刻用到的主要標(biāo)簽如下圖所示:
2)實(shí)例測試:
編寫dcm_to_bmp的測試php,代碼如下:
#!/usr/bin/php
#
# Creates a jpeg and jpeg thumbnail of a DICOM file
#
require_once(‘../class_dicom.php’);
$file = (isset($argv[1]) ? $argv[1] : ‘dean.dcm’);
if(!$file) {
print “USAGE: ./dcm_to_jpg.php \n”;
exit;
}
if(!file_exists($file)) {
print “$file: does not exist\n”;
exit;
}
$job_start = time();
$d = new dicom_convert;
$d->file = $file;
$d->dcm_to_bmp();
#$d->dcm_to_tn();
#system(“l(fā)s -lsh $file*”);
$job_end = time();
$job_time = $job_end – $job_start;
#print “Created BMP and thumbnail in $job_time seconds.\n”;
header(“Content-type:image/bmp\n\n”);
$jpgName=$d->jpg_file;
$fp=fopen($jpgName,”r”);
fpassthru($fp);
exit;
?>
在利用dcmj2pnm將dcm轉(zhuǎn)換成bmp文件后,就可以直接利用前面博文中PHP輸出圖像到瀏覽器的代碼來輸出結(jié)果,在瀏覽器中輸入:http://localhost/class_dicom_php/examples/dcm_to_bmp.php,順利得到dean.dcm測試文件的圖像信息,如下圖所示:
至此,利用PHP DICOM Class快速便捷地實(shí)現(xiàn)了將dcm文件的圖像信息輸出到瀏覽器的功能。
【注】:在上述dcm_to_bmp.php測試文件中需要將#system(“l(fā)s -lsh $file*”);語句注釋掉,否則在windows的WAMP環(huán)境下會(huì)出現(xiàn)問題。
學(xué)習(xí)DCMTK的資料:
原來只是利用OFFIS的論壇(http://forum.dcmtk.org/index.php)來搜索使用DCMTK過程中遇到的各種錯(cuò)誤,從來沒有仔細(xì)全面的瀏覽過OFFIS論壇的各個(gè)部分,通過今天的親身經(jīng)歷,發(fā)現(xiàn)在OFFIS論壇的DCMTK項(xiàng)目下的【Third-Party
DCMTK Applications】部分也是一個(gè)知識寶藏,里面包含了各種牛人利用DCMTK開發(fā)的工具,大多都是開源的,相關(guān)文檔也很詳細(xì),以后可以作為重點(diǎn)學(xué)習(xí)的資料。
下面給出幾個(gè)我覺得很值得學(xué)習(xí)的鏈接,供大家參考:
http://forum.dcmtk.org/viewtopic.php?f=19&t=1225,一個(gè)開源的DICOM文件瀏覽器,功能豐富;
http://forum.dcmtk.org/viewtopic.php?f=19&t=2919,我們上文提到的PHP DICOM Class作者發(fā)的帖子,感謝大神的無私;
http://medicalanonymization.olympe.in/index.html,一位優(yōu)秀的DCMTK程序員實(shí)習(xí)期間項(xiàng)目的開源站:有對DCMTK使用的詳細(xì)介紹(后續(xù)有時(shí)間就逐個(gè)翻譯);
http://forum.dcmtk.org/viewtopic.php?f=19&t=2373,一個(gè)在Windows系統(tǒng)下的DICOM文件瀏覽器;
總結(jié)
以上是生活随笔為你收集整理的php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CI3.0的学习教程有没有人分享一下??
- 下一篇: 爸爸天亮叫我剧情介绍