预告了很久的几篇专栏博文一直没有整理好,主要缘由是早前但愿搭建的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三种网络链接模式的实际测试