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

背景:

预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的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源码文件。

4064.html53fd0de07188462e211f81909a189f19.png

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“。

2eb1f8c8eec7b4bfdbe89374bffba2e7.png

其中作者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目录下,如下图所示:

4aa98510c4190fd4c7223da9fae58d2c.png

第三,开启wamp server服务,在浏览器中输入http://localhost/class_dicom_php/examples/get_tags.php,进行测试,正常的话会输出dean.dcm文件的Tags标签信息,如下图所示:

c461b95fa5d5ada7161d4ceb9daa32f2.png

41b2c47d0ad93b9242c884a1625b9297.png

如上所示浏览器中看到的结果与利用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图像,如下图所示:

97355221689ef98a87eb5834d5f1ff2d.png

当然也可以通过识别dcm具体的图像标签来自动设定保存的bmp格式,在自适应时刻用到的主要标签如下图所示:

7ac56a6294a3fc37fec5e6531c7d06f7.png

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测试文件的图像信息,如下图所示:

d6c5fbbb6139ab8e8ab3e12030d41f78.png

至此,利用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文件浏览器;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381303.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mfc在运行的时候为什么没有实例化_为什么不建议把数据库部署在Docker容器内?...

本文同步Java知音社区,专注于Java原文:https://www.toutiao.com/i6805798581971190276/近2年Docker非常的火热,各位开发者恨不得把所有的应用、软件都部署在Docker容器中,但是您确定也要把数据库也部署的容器中吗?这个…

泛型的优势

假设需要一个两个整形变量交换的函数,我们很快就可以嗒嗒嗒嗒的敲出下面的 Swap 函数:void Swap(ref int lhs, ref int rhs){int temp lhs;lhs rhs;rhs temp;}随着项目进展,我们发现,需要用到 Swap 函数的不仅是整形,变量 还有…

系统分析师资料_如何成为一名数据分析师?

随着大数据的逐渐普及,数据分析越来越普遍应用到各个职能岗位,也就是说,不论你在哪个行业,都会需要数据分析技能。数据岗位的薪资水涨船高,成为目前最有潜力的职业选择之一。根据猎聘发布《猎聘2019年中国AI&大数据…

设置文本区域大小_数据验证基本设置技巧

数据验证可以规范用户的文本及数字输入格式,如只能输入指定区间的数值、只能输入文本数据、限制输入空格、限制输入重复值等。设置了数据验证条件后,对符合条件的数据允许输入,对不符合条件的数据则禁止输入。因此,利用此设置可以…

mysql5.7修改root密码_七小服公开课EMC isilon修改丢失的root密码

1、连接串口,并重启2、在终端上,当引导过程中看到如下提示符时,按下空格键:Hit [Enter] to boot immediately, or any other key for command prompt.3、在OK提示符下,运行以下命令:boot -s4、看到 "Enter full pathname of …

服务器php只显示文本,服务器上的php echos文件是文本而不是二进制文件

我编写了一个PHP页面,它读取一个文件,并在添加了一些头文件后对其进行回显:header(Content-disposition: filename" . $fname . ");header(Pragma: no-cache);header(Expires: 0);header(Cache-Control: must-revalidate, post-check0, pre-check0);header(Pragma: p…

vc 6.0 显示文件全路径_配送路径规划思考(十二)

前面十一集的链接配送路径规划思考(十一)配送路径规划思考(十)配送路径规划思考(九)配送路径规划思考(八)配送路径规划思考(七)配送路径规划思考(六)配送路径规划思考(五)配送路径规划思考(四)配送路径规划思考(三)配送路径规划思考(二)配送最短路径思考(一)思考(十一)分享了政…

怎么暂时关闭网站php,WordPress怎么临时关闭网站进行维护

有时可能会因为各种原因导致我们的网站出现访问错误,此时我们就需要临时关闭站点进行维护,那么我们该如何临时关闭站点进行维护呢?下面让我们来看一下如何临时关闭我们的站点吧。1、.maintenance法在WordPress根目录下新建一个名为.maintenan…

DataList控件分页

实现了对DataList的分页 HTML控件的值需要转换web应用程序就可以取到了 1 /**//// <summary> 2 /// 当前页数 3 /// </summary> 4 int CurrentPage; 5 /**//// <summary> 6 /// 每页条数 7 /// </summa…

现代php 阅读笔记,PHP 手册阅读笔记 - 语言参考篇

最近计划把 PHP手册&#xff0c;认真的先过一遍。记录一些以前不知道&#xff0c;不明确的知识。语言参考 > 类型【新认知】强制转换类型用 settype( mixed $var, string $type )。判断变量的类型用is_type函数。例如&#xff1a;if (is_int($an_int)) {$an_int 4;}if (is_…

mongodb连接失败_mongodb 数据库及数据分页

本文转载于 SegmentFault 社区作者&#xff1a;小小蚊子在做自己的一个小项目时&#xff0c;新学习了 mongodb非关系型数据库&#xff0c;使用了 mongoose封装好的查询方法&#xff0c;包括数据库分页用到的limit和 skip 方法&#xff0c;这里记录下。一mongodb 数据库连接参照…

mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了

优化器的作用&#xff1a;我们知道&#xff0c;一条SQL语句&#xff0c;可以有很多执行方式&#xff0c;最后都返回相同的结果&#xff0c;而优化器的作用就是找到最好的执行计划。一、RBO-基于规则的优化器(rule)系统内置的一套硬编码规则&#xff0c;根据规则生成执行计划&am…

购物车的收货地址js php,Javascript实现购物车功能的详细代码

我们肯定都很熟悉商品购物车这一功能&#xff0c;每当我们在某宝某东上购买商品的时候&#xff0c;看中了哪件商品&#xff0c;就会加入购物车中&#xff0c;最后结算。购物车这一功能&#xff0c;方便消费者对商品进行管理&#xff0c;可以添加商品&#xff0c;删除商品&#…

CLI下的网页浏览器之二——Lynx

出自&#xff1a;http://vb2005xu.javaeye.com/blog/230044 Lynx浏览器使用指南 Lynx是一个字符界面下的全功能的WWW浏览器。Lynx 可以运行在很多种操作系统下&#xff0c;如VMS, UNIX, Windows 95, Windows NT等&#xff0c;当然也包括Linux。 由于没有漂亮的图形界面&#xf…

stm32 整数加法循环时间_【教学设计】小数加法教学设计

小数加法教学设计刘秀锦舞钢市特殊教育学校教材分析本节课是第四单元“小数加减法”的第一课时&#xff0c;小数加减法是以整数加减法为基础进行教学的&#xff0c;本节课走踏实了&#xff0c;后边的知识才能顺利的进行下去&#xff0c;所以本节课还是以小步走、学一点、练一点…

天锐绿盾解密_天锐绿盾数据防泄密系统

天锐绿盾数据防泄密系统&#xff08;简称数据防泄密系统&#xff09;是一套从源头上保障数据安全和使用安全的软件系统。包含了文件透明加解密、内部文件流转、密级管控、离线管理、文件外发管理、灵活的审批流程、工作模式切换、服务器白名单等功能&#xff0c;并全面覆盖Mac、…

矩阵维度必须一致_如何从看得懂到会使用矩阵思维

本来我一开始是想学习如何使用艾森豪威尔矩阵的&#xff0c;但是利用学习观的方法想去网上找有关艾森豪威尔矩阵的例子时&#xff0c;发现网上几乎没有&#xff0c;网上能搜出来的都是对这个矩阵的介绍&#xff0c;看完这些介绍你会发现很简单&#xff0c;都能看懂&#xff0c;…

numpy 归一化_归一化(MinMax)和标准化(Standard)的区别

此文参考https://blog.csdn.net/u010947534/article/details/86632819定义上的区别归一化&#xff1a;将数据的值压缩到0到1之间&#xff0c;公式如下标准化&#xff1a;将数据所防伪均值是0&#xff0c;方差为1的状态&#xff0c;公式如下&#xff1a;归一化、标准化的好处&am…

python多态_Python基础入门18节-第十六节 面向对象如何理解多态

多态是面向对象的一大特性&#xff0c;Python本身也是一门多态性的语言。在Python中要实现多态&#xff0c;还是得借助于上节提到的继承。假设有这么一个场景&#xff0c;在夏季我们可以看到荷花、牡丹花、太阳花&#xff0c;夏天一到这些花全都开放了。这些花我们就将它理解多…

linux重启后root密码错误,Linux技巧| 解决Debian Root密码忘记的问题

Debian Root密码忘记开机 grub 菜单下进入单用户模式进行修改密码/修改系统文件。解决过程注&#xff1a;本教程适用于 Debian 7 8 91. 首先。重启一下系统。在开机 grub 内核选择菜单那里&#xff0c;迅速按“e”。2. 将光标移动到“linux”开头的那一行&#xff0c;将原来的“…