DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class
背景:
预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题。起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WML服务,借此就可以同时完成WEB PACS系列以及搭建Dicom WML服务器的两篇博文。可是在实际部署过程中发现了几个严重的问题,一时无法解决。但是在搜索解决方案的时候,偶然间找到了在DCMTK论坛上贴出来的用PHP对DCMTK工具包封装的文章。因此此篇博文在记录搭建WML遇到的问题的同时,主要想向大家介绍一下这个简单的封装DCMTK工具包的PHP类,并在前期搭建的WAMP服务器上给出示范实例。(PS:也希望知道如何解决该问题的大神赶紧现身)
问题:
按照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源码文件。
wwwapp安装的相关资料:
搜索相关资料后,发现柳北风儿前辈此前也遇到过该问题,并向OFFIS的相关维护人员进行过咨询。前辈的说明博文地址是:http://qimo601.iteye.com/blog/1701026,OFFIS论坛的讨论地址是:http://forum.dcmtk.org/viewtopic.php?f=1&t=723&hilit=wwwapp.txt。
尝试解决:
按照上述的说明,确信应该是在编译DCMTK源码中间的某个环节出现了问题,导致本应该顺利生成的几个exe文件丢失。官方论坛中的讨论是针对Linux环境下利用make工具来编译的情况,该环境下在利用make安装的时候由make distclean指令来控制preplock、readoviw、readwlst、writwlst等可执行文件的清除。但是在Windows环境下用的是CMake来生成与VS对应的sln文件,打开DCMTK.sln解决方案后并未找到如何设置才能编译生成上述可执行文件,而且按照柳前辈的说法,即使编译成功,在Win7环境下同样缺少一个preplock.exe文件。至此该问题的解决就终止了,到发文时刻还未找到很好的解决方法。
PHP DICOM Class
在浏览OFFIS论坛,寻找上述问题的解决方案时,无意点开了论坛中的“Third-Party DCMTK Applications”分支,如下图所示,该分论坛中介绍了众多DCMTK相关的应用开发,其中有一项叫做“PHP DICOM Class“。
其中作者Vedicveko给出了PHP Dicom Class类的设计初衷以及详细的使用说明,说明文档网址为:http://deanvaughan.org/wordpress/dicom-php-class/。
下载源码(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文件的大多数操作,具体的实现如下。
PHP DICOM Class的安装:
第一,将DCMTK编译后的工具包统一放到指定位置,例如我的本机地址为:c:\dcmtk\bin,修改class_dicom.php文件中的如下代码,将TOOLKIT_DIR指向本机工具包目录c:\dcmtk\bin。
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,就会顺利得到上述结果。
示例:向浏览器输出DCM图像数据
1)添加dcm_to_bmp()函数:
虽然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()函数,具体代码如下:
- ### 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的指令参数不同,bmp文件用到的是+ob参数,dcmj2pnm本身可以生成多种格式的bmp图像,如下图所示:
当然也可以通过识别dcm具体的图像标签来自动设定保存的bmp格式,在自适应时刻用到的主要标签如下图所示:
2)实例测试:
编写dcm_to_bmp的测试php,代码如下:
- #!/usr/bin/php
- <?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 <FILE>\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("ls -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转换成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环境下会出现问题。
学习DCMTK的资料:
原来只是利用OFFIS的论坛(http://forum.dcmtk.org/index.php)来搜索使用DCMTK过程中遇到的各种错误,从来没有仔细全面的浏览过OFFIS论坛的各个部分,通过今天的亲身经历,发现在OFFIS论坛的DCMTK项目下的【Third-Party DCMTK Applications】部分也是一个知识宝藏,里面包含了各种牛人利用DCMTK开发的工具,大多都是开源的,相关文档也很详细,以后可以作为重点学习的资料。
下面给出几个我觉得很值得学习的链接,供大家参考:
- http://forum.dcmtk.org/viewtopic.php?f=19&t=1225,一个开源的DICOM文件浏览器,功能丰富;
- http://forum.dcmtk.org/viewtopic.php?f=19&t=2919,我们上文提到的PHP DICOM Class作者发的帖子,感谢大神的无私;
- http://medicalanonymization.olympe.in/index.html,一位优秀的DCMTK程序员实习期间项目的开源站:有对DCMTK使用的详细介绍(后续有时间就逐个翻译);
- http://forum.dcmtk.org/viewtopic.php?f=19&t=2373,一个在Windows系统下的DICOM文件浏览器;
后续博文介绍:
利用PHP Skel结合DCMTK开发WEB PACS应用
利用DCMTK搭建WML服务器利用Oracle直接操作DICOM数据
C#的异步编程模式在fo-dicom中的应用
VMWare三种网络连接模式的实际测试
DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class的更多相关文章
- DICOM医学图像处理:WEB PACS初谈
背景: 周末看到了一篇原公司同事的文章,讲的是关于新的互联网形势下的PACS系统.正好上一篇专栏文章也提到了有想搭建一个worklist服务器的冲动,所以就翻箱倒柜将原本学生时代做课题时搭建的简易We ...
- DICOM医学图像处理:WEB PACS初谈二,图像的传输
背景: 如前一篇专栏博文所述,借助于CGI或FastCGI技术转发浏览器发送过来的用户请求,启动本地的DCMTK和CxImage库响应.然后将处理结果转换成常规图像返回到浏览器来实现Web PACS. ...
- DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM
背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只 ...
- DICOM医学图像处理:storescp.exe与storescu.exe源码剖析,学习C-STORE请求
转载:http://blog.csdn.net/zssureqh/article/details/39213817 背景: 上一篇专栏博文中针对PACS终端(或设备终端,如CT设备)与RIS系统之间w ...
- [转]DICOM医学图像处理:Deconstructed PACS之Orthanc
转载:http://blog.csdn.net/zssureqh/article/details/41424027 背景: 此篇博文介绍一个开源的.基于WEB的DICOM Server软件.该开源软件 ...
- DICOM医学图像处理:Deconstructed PACS之Orthanc
背景: 此篇博文介绍一个开源的.基于WEB的DICOM Server软件.该开源软件完全使用C++编写,不依赖于第三方数据库(内置了SQLite数据库)或其他框架,支持RESTful API设计模式. ...
- DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像
背景介绍: 近期项目需求,须要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发.在C++语言下,我使用的是应用最广泛的DCMTK开源库,在本专栏的起初阶段的大多数博文都是对DCMTK开源 ...
- DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store
背景: 上一篇博文对DICOM中的网络传输进行了介绍.主要參照DCMTK Wiki中的英文原文.通过对照DCMTK与fo-dicom两个开源库对DICOM标准的详细实现,对理解DICOM标准有一个更直 ...
- DICOM医学图像处理:深入剖析Orthanc的SQLite,了解WADO & RESTful API
背景: 上一篇博文简单翻译了Orthanc官网给出的CodeProject上“利用Orthanc Plugin SDK开发WADO插件”的博文,其中提到了Orthanc从0.8.0版本之后支持快速查询 ...
随机推荐
- Hillstone设备管理-设备软件Stone-OS升级
1.通过sysloader进行StoneOS升级 1)给设备上电按提示按ESC并且进入 Sysloader.参照以下操作提示: 2)在下面选择对应的选项升级os,可以通过tftp.ftp.usb.系统 ...
- python、java读数据
python从txt文档中读数据有个特别神奇的函数 可以把txt文档中的数据直接读取成python数组 java用Scanner类读数据比较方便
- hashmap源码研究
概述 在官方文档中是这样描述HashMap的: Hash table based implementation of the Map interface. This implementation pr ...
- openwrt添加内核模块
进行目录package/kernel mkdir url-redirect cd url-redirect [zzh@KD1 url-redirect]$ tree . |-- Makefile `- ...
- PHP基础(命名错误)错误导致的500
记得去年七月份参与一个项目发生的一个低级错误 因为不小心在命名一个方法时使用了一list做为名称,因此在后面无明业火被点燃. 发现一个500,无论如何调整总是500,数据库,文件,url都正确,但就是 ...
- win10在Pycharm中安装scrapy
查看官网说明 发现推荐是安装Anaconda 或 Miniconda,这东西有点大而全,感觉目前用不上.所以没这样做. 直接安装scrapy 如果直接装会报错的,参考文章就可以解决. 这里记一下组件下 ...
- Ubuntu16.04 安装Tensorflow1.7过程记录二:安装CUDA及Tensorflow
参考 How to install Tensorflow 1.7.0 using official pip package 其中的CUDNN应该改为7.05for CUDA9.0 后面安装的spyde ...
- Linux任务计划命令 :crontab -e
crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond ...
- Java 学习路线图
一.集合 集合类的分类 * (一)List 结构集合类 * ArrayList LinkedList Vector Stack * (二)Map 结构集合类 * HashMap HashTable * ...
- 山东省ACM多校联盟省赛个人训练第六场 poj 3335 D Rotating Scoreboard
山东省ACM多校联盟省赛个人训练第六场 D Rotating Scoreboard https://vjudge.net/problem/POJ-3335 时间限制:C/C++ 1秒,其他语言2秒 空 ...