背景:

预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的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安装的相关资料:

尝试解决:

按照上述的说明,确信应该是在编译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] : ‘ ‘);

示例:向浏览器输出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参数,当然也可以通过识别dcm具体的图像数据来自适应,dcmj2pnm本身可以生成多种格式的bmp图像,如下图所示:

2)实例测试:

编写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("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文件的图像信息输出到浏览器的功能。

学习DCMTK的资料:

原来只是利用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三种网络连接模式的实际测试

原文:http://blog.csdn.net/zssureqh/article/details/40796875

php接dicom,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class相关推荐

  1. php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

  2. DICOM医学图像处理:二零一四▪DICOM专栏一览

    题记 二零一四刚过,新年伊始就发生了"外滩踩踏"恶性事件,告诫我们要珍爱生命,为自己更为家人-- 回顾去年,有些许收获.有些许感慨-- 曾经听过一个段子说两个在公司工作多年的老员工 ...

  3. [转]DICOM医学图像处理:Deconstructed PACS之Orthanc

    转载:http://blog.csdn.net/zssureqh/article/details/41424027 背景: 此篇博文介绍一个开源的.基于WEB的DICOM Server软件.该开源软件 ...

  4. 【转】DICOM医学图像处理:DICOM网络传输

    背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的.当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就 ...

  5. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...

  6. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  7. Java DICOM 网络传输_DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store

    背景: 上一篇博文对DICOM中的网络传输进行了介绍,主要参照DCMTK Wiki中的英文原文.通过对比DCMTK与fo-dicom两个开源库对DICOM标准的具体实现,对理解DICOM标准有一个更直 ...

  8. 【转】DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    转自:https://www.cnblogs.com/mfrbuaa/p/4004114.html 有修订 背景介绍: 近期项目需求,需要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发 ...

  9. DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store

    背景: 上一篇博文对DICOM中的网络传输进行了介绍,主要参照DCMTK Wiki中的英文原文.通过对比DCMTK与fo-dicom两个开源库对DICOM标准的具体实现,对理解DICOM标准有一个更直 ...

  10. DICOM医学图像处理:BMP转DCM、DCM转BMP、多张BMP转DCM、JPG转DCM,,多张JPG转DCM。

    使用DCMTK库实现BMP转DCM的互相转换以及JPEG转DCM.使用DCMTK库其中在编译的时候错了好几次,在这有编译好的库给大家分享在此附上连接只需要1积分(DCMTK编译好的库-C/C++其他资 ...

最新文章

  1. Ghost 系统的过程
  2. BIEE连接数据库的方法
  3. 略微讲一下今天的所学吧
  4. php框架 wc if_PHP if else语句
  5. web前端知识点太多_web前端常见知识点
  6. 事件处理程序中event参数的传递
  7. 操作系统 多线程之优先级翻转
  8. 为什么快捷指令无法将媒体转换为文本_快捷指令自动化可以做什么,不能做什么?...
  9. java intern_Java intern() 方法
  10. vue PC 端使用腾讯地图定位
  11. 如何在matlab中进行非线性规划,matlab非线性规划_图文.ppt
  12. 【STM32 .Net MF开发板学习-02】GPIO测试
  13. 进阶光照与材质之光照和反射模型
  14. 整车试验数采设备技术方案
  15. 1.8w 字 | 初中级前端 JavaScript 自测清单 - 2
  16. EZ-USB CY7C68013A固件Slave FIFO初始化
  17. ASEMI场效应管7N80怎么测量好坏
  18. java实现写字板对pdf文件签名
  19. 中山纪念中学 培训 日记
  20. iOS开发规范学习总结与框架搭建

热门文章

  1. 软考软件设计师下午题目java设计模式(自用)
  2. 显卡功耗测试用什么软件,跑什么测试显卡功耗最高:这20个项目能给你答案
  3. 为flash游戏终极实用提速
  4. 博士申请 | 新加坡国立大学Xinchao Wang老师招收图神经网络方向博士/博后
  5. ES6的新特性,前端必看知识点
  6. 24-思科防火墙:ASA透明防火墙实验
  7. 修改 apk 默认的安装位置(不需要 Root)
  8. C# 修改list所有对象中的某字段
  9. 神经网络 知识图谱,神经网络基础知识
  10. Springboot数据库配置文件明文密码加密解密