基于Delphi的“虚拟胶片打印系统”的技术实现

2014-09-26 20:12张颖
软件工程 2014年9期

张颖

摘 要:利用Delphi和VS这两种开发平台,结合Oracle数据库,实现胶片排版、胶片调整、虚拟打印,自助打印、系统管理等功能。重点介绍了系统开发过程中针对特殊问题采用的几种技术。目的是完成胶片的集中打印管理,胶片存储备份,减少开支。

关键词:Delphi;PACS;C/S;胶片虚拟打印

中图分类号:TP31 文献标识码:A

1 引言(Introduction)

在美国,拥有许多医疗影像诊断与Internet相结合的PACS系统(Picture Archiving and Communication Systems),随着网络IT技术的发展,实现了真正意义的远程会诊,并将实现无胶片化。在欧洲,PACS与医院信息系统融合,形成日趋爆炸的医学信息网,并产生了越来越多的应用方向。在亚洲一些发达国家,如日本、韩国、我国台湾地区,经过十几年的发展,特别是一些国家的政府大力扶持之下,PACS系统已经实用化。由于我国开发和引进PACS系统较晚,目前已经建立并有效运行的PACS系统并不多见。究其原因主要是标准化程度低、兼容性差、一般为封闭式的专用系统,既不经济、价格也昂贵,配置的硬件合理,对工作量大的医院缺乏强大的存储子系统,无法支持数量巨大的常规放射影像,因此不能真正实现无片化管理。现有的PACS系统设计大多数没有考虑技术发展和扩展需要的可能,难以与现有的HIS/RIS整合为一个系统[1]。

2 虚拟胶片打印系统功能(The capability of virtual

film printing system)

系统主要实现胶片排版、胶片调整、虚拟打印、自助打印、系统管理等功能。目的是完成胶片的集中打印管理,胶片存储备份,减少开支。普通PC机上达到或者接近设备工作站的处理速度;采用大数据量压缩算法尽量减少存储空间需求;解决胶片打印的虚拟化技术。

3 关键技术(The key technologies)

实现以上功能要解决的关键技术有数据压缩技术,数据传输技术,共享内存技术,大数据量下的数据处理技术,与三方RIS系统接口技术等等。

3.1 数据库技术介绍(The database technology)

不一样的数据库有不一样的特征,有自己的适用场合,Access用于小型系统;My SQL用于中小型系统;SQL server用于中型系统;Oracle用于大型系统;Db2用于大中小型系统。本系统采用Oracle数据库。

Oracle数据库产品是当前数据库技术的典型代表,Oracle的产品除了数据库系统外,还有应用系统和开发工具等。目前的Oracle 9是一个面向对象的数据库系统,它既非纯的面向对象的数据库也非纯的关系数据库,而是两者的结合,因此叫做“对象关系数据库”[2]。

3.2 共享内存技术介绍(The shared memory technology)

内存映射文件的原理是,先保留一段虚拟内存空间,再将磁盘文件提交给这段内存空间,并且返回一个指向这段内存空间的指针,就可以访问文件的内容了。

使用内存映射文件的好处:可以实现不同进程间共享文件或共享内存区域中的数据;可访问映射文件的数据,并简化对文件访问的操作。内存映射文件的使用步骤:

Step1:创建或打开一个磁盘文件,调用FileCreate()或FileOpen()函数。

Step2:创建或打开内存映射文件对象,调用CreateFileMapping()或OpenFileMapping()函数。

Step3:将磁盘文件的视图映射到进程的地址空间中,调用MapViewOfFile()函数。

Step4:取消文件视图的映射,调用UnmapView

OfFile()。

Step5:关闭文件映射和文件,调用CloseHandle()和CloseFile()分别关闭文件映射和文件。

3.3 使用TIdFtp控件实现胶片的上传和下载(Use the

IIdFtp control to achieve film upload and download)

系统在上传和下载胶片时,采用FTP传输。Delphi中使用TIdFtp控件实现文件的下载:指定Put的AAppend:=True。TIdFtp的网络操作大部分是阻塞模式的。这样在上述操作运行的时候用户界面被暂时冻结,必须要等待调用返回才能继续用户操作界面响应。所以在实际编程中,需要使用多线程的方式来保证用户界面的响应。Windows系统可以使用CreateThread系统调用来创建线程,但是在使用的时候需要开发人员做很多额外的工作来保证线程的同步等问题。Indy中包含了实现多线程的控件TIdThreadComponent,该控件实现多线程时更加方便,也更容易控制。

3.4 通过VS编译DCMTK(Compiled DCMTK by VS)

DCMTK(Digital Imaging and Communications in Medicine医学数字成像和通信)是一个开放程序代码的DICOMToolkit,是目前最广为应用的处理DICOM影像的工具包[3]。要使用该工具包则需要对其进行编译,得到我们需要的库文件.lib,然后再和头文件一起加入到我们的工程中进行使用。在程序中使用编译的函数库,主要是要把.h和.lib文件加入到工程中。对于源码来说.h文件都相同,而.lib文件一般来说会有debug版本和release版本,不同的版本只是在对源码进行编译时,选择的编译模式不同。

第一,准备工作。下载编译的源文件和工具及支持工具包,下载编译工具Cmake。在任意盘,新建文件夹DCMTK,将下载文件均放到该文件夹并解压到当前文件夹;然后新建三个文件夹分别叫bin、lib和support。把支持库的文件夹都移到support中,而bin和lib用来放编译结果。endprint

第二,向VS2005安装目录中添加支持库文件。在support文件夹中搜索include,将搜索到的所有文件全部复制到vs2005的VC目录中;将xinclude.移到D:/ProgramFiles/MicrosoftVisualStudio8/VC/include中。同样搜索*_d.lib文件,将其添加到D:/ProgramFiles/MicrosoftVisualStudio8/VC/lib文件夹中,文件名中去掉_d(若编译release版本,则搜索*_o.lib文件,复制到D:/ProgramFiles/MicrosoftVisualStudio8/VC/lib文件夹,再去除_o)。接着搜索bin,将搜索结果放到D:/ProgramFiles/MicrosoftVisualStudio8/VC/bin。

第三,CMAKE工具的使用。首先,更改编译标志。打开C:/DCMTK/cmake-2.6.0-win32-x86/bin中的cmake-gui.exe程序,设定编译的源代码路径和输出路径,在此选择C:/DCMTK/dcmtk-3.5;勾选“showadvanceentries”,然后将编译的开关设置为MT,默认的为MD,注:MT、MD是决定库文件的引用方法,在VS2005的MFC程序中,项目->属性—>配置属性->常规中,“MFC的使用”项中选择“共享的DLL中使用MFC”时才选择MD,其他两种情况选择MT。在使用Cmake是一定要保证:C:/DCMTK/dcmtk-3.5.4文件夹中的CMakeLists.txt中,CMAKE程序的编译开关,VS2005中项目程序中的MT、MD标志一致。然后,勾选全部支持库,并且找到EXECUTABLE_OUTPUT_PATH和LIBRARY_OUTPUT_PATH分别设为C:/DCMTK/bin和C:/DCMTK/lib,这样最后编译出来的lib文件和exe文件就在这两个文件夹中,勾选支持库和设置输出目。最后,点击Configure,选择当前编译器。然后点击Genarate,生成DCMTK的项目文件。此时会出现红色警告。让你在某个目录下的Cmakelist.txt文件中的ADD_EXECUTABLE(${PROGRAM}${PROGRAM})行前添加:

if(COMMANDcmake_policy)

cmake_policy(SETCMP0003NEW)

endif(COMMANDcmake_policy)

这是由于DCMTK3.5.4是对Cmake2.4版本的使用,使用高于2.6.0的Cmake进行编译金辉出现此警告,在其弹出的指定文件夹中的cmakelist文件中相应的位置,添加要求添加的语句即可。

第四,在VS2005中进行编译。首先,编译ALL_BUILD。进入C:/DCMTK/dcmtk-3.5.4目录,双击dcmtk.sln文件,在打开的项目中,从主选单中选“生成”-“批生成”,在弹出的对话盒中勾选“ALL_BUILD”的DEBUG方案,并按下“生成”。然后,编译INSTALL。主选单中选“生成”-“批生成”,在弹出的对话盒中勾选“INSTALL”的DEBUG方案,并按下“生成”。

第五,VS2005中使用DCMTK。这里主要介绍DEBUG版本的DCMTK库在VS2005中的应用。DCMTK的支持库已经加入VS2005的内置库中,现在只需要添加DCMTK的库即可。(1)头文件的安放:如同支持库文件的添加方法一样,在C:/DCMTK/dcmtk-3.5.4中搜索Include然后将搜索结果放入到VS2005中VC目录下Include中。(2)库文件的安放:新建一个MFC工程,再将C:/DCMTK/lib文件夹中.lib文件放入工程文件夹中,然后在stdafx.h中添加如下代码:

#pragmacomment(lib,"netapi32.lib")

#pragmacomment(lib,"wsock32.lib")

#pragmacomment(lib,"ofstd.lib")

#pragmacomment(lib,"dcmdata.lib")

#pragmacomment(lib,"dcmimgle.lib")

#pragmacomment(lib,"dcmimage.lib")

#pragmacomment(lib,"ijg8.lib")

#pragmacomment(lib,"ijg12.lib")

#pragmacomment(lib,"ijg16.lib")

#pragmacomment(lib,"dcmjpeg.lib")

#pragmacomment(lib,"dcmnet.lib")

#pragmacomment(lib,"dcmdsig.lib")

#pragmacomment(lib,"dcmsr.lib")

#pragmacomment(lib,"dcmtls.lib")

#pragmacomment(lib,"dcmpstat.lib")

#pragmacomment(lib,"dcmwlm.lib")

#pragmacomment(lib,"dcmqrdb.lib")

#pragmacomment(lib,"dcmtkeay.lib")

#pragmacomment(lib,"dcmtkssl.lib")

#pragmacomment(lib,"iconv.lib")

#pragmacomment(lib,"libtiff.lib")

#pragmacomment(lib,"libpng.lib")

#pragmacomment(lib,"libxml2.lib")

#pragmacomment(lib,"zlib.lib")

这样就可以在工程中使用DCMTK了。如果要改为release版本,则需要将DCMTK的支持库、库文件的.lib文件更换掉。

第六,涉及的外部接口。硬件接口:(1)条码扫描枪扫描一维条形码将识别的号码录入系统。(2)读卡器通过刷IC卡将病人卡号等基本信息录入系统。软件接口:(1)胶片打印通过共享内存的方式调用FilmSend.exe程序进行胶片打印。(2)报告打印通过socket套接字的方式调用AutoPrintReport.exe程序进行报告打印。

4 结论(Conclusion)

在经过模块的测试后,胶片排版可按指定布局进行排列,已经能够证实该软件排版功能已基本达到要求,调试功能能够实现,但是稳定性还有待加强;系统设置功能也得以实现。需进一步加强该系统的传输速度及稳定性。

参考文献(References)

[1] 李国强.PACS系统及构建医院PACS中存在的问题[J].实用医

技杂志,2006,13(16):2853-2854.

[2] 张晓林,吴斌,晁阳.Oracle数据库开发基础教程[M].北京:清华

大学出版社,2009.

[3] 王伟蔚,等.基于DICOM文本与内容的医学图像检索系统研

究[J].计算机工程与设计.2011,32(3):1014-1018.

作者简介:

张 颖(1981-),女,硕士,助理实验师.研究领域:计算机应

用,软件工程.endprint