DICOM医学图像处理:WEB PACS初谈二,图像的传输

背景:

        如前一篇专栏博文所述,借助于CGI或FastCGI技术转发浏览器发送过来的用户请求,启动本地的DCMTK和CxImage库响应,然后将处理结果转换成常规图像返回到浏览器来实现Web PACS。本博文通过实际的代码测试来验证这一模式的可行性,同时对C语言编写CGI脚本提出了一些问题。

难题:

        计划参照DCMTK自带工具dcm2pnm.exe的源码,通过DicomImage将DCM文件转换成BMP文件,然后利用CGI技术返回到浏览器。实现一次简单的WEB PACS的影像传输模拟。具体的代码如下,

// dcmtk-save-test.cpp : 定义控制台应用程序的入口点。
//

#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/dcmdata/dcpxitem.h"
#include "dcmtk/dcmjpeg/djdecode.h"
#include "dcmtk/dcmjpeg/djencode.h"
#include "dcmtk/dcmjpeg/djcodece.h"
#include "dcmtk/dcmjpeg/djrplol.h"
#include "dcmtk/dcmimgle/diutils.h"
#include "dcmtk/dcmimgle/dcmimage.h"

void SendImageDcmtk(char* filename)
{
	DcmFileFormat mDcm;
	mDcm.loadFile(filename);
	E_TransferSyntax xfer = mDcm.getDataset()->getOriginalXfer();
	unsigned long mode = CIF_MayDetachPixelData | CIF_TakeOverExternalDataset;
	DicomImage *di = new DicomImage(&mDcm,xfer,mode,0,0);
	if(di == NULL)
	{
		Print2Web("Can not open DCM file by DicomImage!");
		
	}
	printf("Content-Type:image/bmp\n\n");
	di->writeBMP(stdout,24,0);
}

int main(int argc ,char* argv[])
{
	char* filename="c:\\test.dcm";
	SendImageDcmtk(filename);
	
	return 0;
}

        编译生成dcm2bmp.exe的CGI程序,将其拷贝到网站的CGI目录(我本机地址为c:\wamp\www\c-cgi)中,通过在浏览器中输入http://localhost/c-cgi/dcm2bmp.exe启动服务端的CGI程序。虽然程序启动顺利,但是并未获得我们想要的结果——输出了一幅奇怪的图像,如下所示:左图是在PACS看图端中看到的真实DCM图像,右图是我传输到浏览器的失败的图像。


验证测试:

        获得了错误的结果,起初并未想到很好的排除错误的方法,遂决定首先确认问题出现的大致范围。因为介绍CGI技术的书籍大多都采用Perl或者PHP来实现,因此仿照书籍中的实例,利用Perl和PHP来实现一次正常的传输图像到浏览器的功能,验证一下该机制是否可行。下面是实际的测试过程,

(1)Perl版本的CGI

#!c:/Perl64/bin/perl.exe

use warnings;
use strict;

binmode STDOUT;
print "Content-type:image/bmp\n\n";

open FILE,'<','c:\test.bmp' or die "Can't open file";


while (my $buf = <FILE> ){
    print $buf;
}

close(FILE);

        经过测试,可以输出正确的图像。

(2)PHP版本的CGI

<?php
$filename="c:/test.bmp";
$size=getimagesize($filename);
$fp=fopen($filename,"r");
#echo $size['mime'];
if($size && $fp)
{
	header("Content-type:image/bmp\n\n");
	fpassthru($fp);
	exit;
	
}
?>
	

       经过测试,也可以输出正确的图像。

结果分析:

        通过上面的两次测试,足以说明WAMP+CGI/FastCGI的环境搭建没有问题。因此可以断定问题出现在C语言编写的CGI脚本程序中,因为CGI脚本是服务端的控制台程序,可以再命令行中直接调试,但是我们是利用DicomImage的writeBMP函数将转换后的bmp图像输出到了stdout中,实际调试中会输出一堆乱码,因为stdout默认是ASCII格式的,所以在命令行中调试CGI脚本的思路行不通。所以决定从最底层入手,利用RawCap.exe工具,抓取浏览器与服务器端的CGI程序之间的数据包,通过分析数据包期望找到问题出现的地方。

1)RawCap

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zssure

己欲立而立人,己欲达而达人

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值