【转】用fo-dicom实现print scu的注意事项!!!!!!!!!

转自:https://blog.csdn.net/tvsofa2008/article/details/50245357

用fo-dicom实现print scu的注意事项

fo-dicom是一个开源的协议库,开发语言是c#。网上针对fo-dicom的分析也有不少,但是专门针对dicom print的文章还是太少了。

近几天需要用fo-dicom实现一个print scu,把其中的一些注意事项总结一下。

工欲善其事,必先利其器。在编程调试过程中各种各样的辅助工具必不可少。经过网上搜索、自己验证测试后,推荐使用方便的scp,scu测试工具:

  1. charruasoft print scu
  2. charruasoft print scp

这两个工具使用方便,scu只需要设置一下called AET、calling AET、remote host、remote port等参数即可。

scp稍微麻烦一些,必须先在Rules选项卡中建立一个新项,填入called AET、打印机名称等。然后在General选项卡中设置scp参数即可。
Rules
General

工具齐备了,下面开始代码吧。fo-dicom本身例子已经包含了printscu和printscp,先直接使用例子中的代码试一下,发现:

  1. fo-dicom printscp + fo-dicom printscu能正常打印。
  2. fo-dicom printscp + charruasoft print scu不能正常打印。
  3. fo-dicom printscu + charruasoft print scp也不能正常打印。

所以貌似fo-dicom自己给的print代码是有问题的,无法直接使用。

先用fo-dicom printscu + charruasoft print scp测试打印,把scp和scu的输出信息抓好保存。
再用charruasoft print scu + charruasoft print scp测试打印,把scp和scu的输出信息抓好保存。
对比分析发现fo-dicom printscu一开始的associate都没有成功!它并没有协商BasicGrayscalePrintManagementMetaSOPClass,分析dicom代码后,PrintJob.cs的Print函数增加如下代码:

DicomPresentationContext pc = new DicomPresentationContext((byte)0, DicomUID.BasicGrayscalePrintManagementMetaSOPClass);
pc.AddTransferSyntax(DicomTransferSyntax.ImplicitVRLittleEndian);
dicomClient.AdditionalPresentationContexts.Add(pc);

当然,我们打印的是黑白片子,如果要打印彩色片子,BasicGrayscalePrintManagementMetaSOPClass要相应改变。

在DicomClient.cs中修改public IAsyncResult BeginSend(Stream stream, string callingAe, string calledAe, AsyncCallback callback, object state)函数:

//foreach (var request in _requests)
//    assoc.PresentationContexts.AddFromRequest(request);
foreach (var context in _contexts)assoc.PresentationContexts.Add(context.AbstractSyntax, context.GetTransferSyntaxes().ToArray());foreach (var pc in assoc.PresentationContexts)
{foreach (var request in _requests){request.PresentationContext = new DicomPresentationContext(pc.ID,request.PresentationContext.AbstractSyntax,pc.AcceptedTransferSyntax,DicomPresentationContextResult.Proposed);}
}

这样associate过程终于通过了。但是在fo-dicom print scu发送第2次N-CREATE数据包时scp返回”处理失败”错误。

继续分析,发现是fo-dicom第2次N-CREATE数据包的Sequence字段中只有ReferencedImageBoxSequence,并不存在ReferencedFilmSessionSequence,这个明显与正确的抓包有差别,因此怀疑是这里的问题,即:fo-dicom在FilmBox的Initialize()函数中没有加入ReferencedFilmSessionSequence字段。找到问题就好解决了,在FilmBox.cs的Initialize()函数中加入代码:

Add(new DicomSequence(DicomTag.ReferencedFilmSessionSequence));var item = new DicomDataset();
item.Add(DicomTag.ReferencedSOPClassUID,_filmSession.SOPClassUID);
item.Add(DicomTag.ReferencedSOPInstanceUID,_filmSession.SOPInstanceUID);var seq = Get<DicomSequence>(DicomTag.ReferencedFilmSessionSequence);
seq.Items.Add(item);
...
//if (!this.Contains(DicomTag.RequestedResolutionID))
//{
//    RequestedResolutionID = "STANDARD";
//}

这回再编译运行,已经能正确的与scp通讯了,片子打印无误。

总结

在我们的应用中,fo-dicom库的print scu代码确实存在问题,无法与胶片打印机正确通讯。

fo-dicom库需要做稍微的修改:

  1. DicomClient.cs的BeginSend函数。
  2. FilmBox.cs的Initialize函数。
  3. fo-dicom例子中的PrintJob.cs的Print函数。

当然,这可能和我们使用的胶片打印机有关,在其它应用中可能还需要适当修改。

问题

1.fo-dicom里找不到print的例子呀,能告诉我在哪里吗?
   fo-dicom-development\Examples\Print SCU目录下

2.代码更正

Add(new DicomSequence(DicomTag.ReferencedFilmSessionSequence));
var item = new DicomDataset();
item.Add(DicomTag.ReferencedSOPClassUID,_filmSession.SOPClassUID);
item.Add(DicomTag.ReferencedSOPInstanceUID,_filmSession.SOPInstanceUID);
var seq = Get<DicomSequence>(DicomTag.ReferencedFilmSessionSequence);//楼主这里少了一个括号
seq.Items.Add(item);

3.新版本按照这个改了,还是没有通过...
fo-dicom request包中InstanceUID字段都是scu产生并填充的,正常来说,scp只是把收到的InstanceUID字段原样返回。因此,你可以控制InstanceUID的值。 并且,用scp response的UID返回值填充下一个request的UID应该是可行的,fo-dicom本身就是这样实现的吧

对的,这个参数导致第二次N-Create的response读取PDU时出错,无法继续进行(用其他SCP程序该步可以通过,因为charruasoft print scp会返回你N-Create设置的参数和它带的其他一些参数),可是当我屏蔽了这个参数,进行到N-Action时,还是有问题,其中的SOPInstanceUID给的不对,应该是动态的,用第二次N-Create返回回来的SOPInstanceUID,然而想在N-Create的Response中设置却是无法实现的,因为在收到Response时,N-Action的request好像已经发出去了,所以逻辑好像是有问题的。(我已用多种虚拟打印设备测试过)

我是改完后根据回忆写的,可能有遗漏的地方。你是用文中提到的那个scp程序测试的吗?如果是应该是能通过的。要是用真实胶片机测试,可能不一定行。你把FilmBox中 //if (!this.Contains(DicomTag.RequestedResolutionID)) //{ // RequestedResolutionID = "STANDARD"; //} 这样改一下试试,祝好运。

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

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

相关文章

DELPHI串口通讯编程

spcomm更加简单 转贴 Delphi中串口通信的实现 河南省计算中心 张海航 -------------------------------------------------------------------------------- Delphi是一种具有功能强大、简便易用和代码执行速度快等优点的可视化快速应用开发工具&#xff0c;它在…

设计模式C++实现 ——观察者模式

观察者模式&#xff1a;定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都得到通知并被自动更新。它还有两个别名&#xff0c;依赖(Dependents)&#xff0c;发布-订阅(Publish-Subsrcibe)。可以举个博客订阅的例子&…

【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8784980 DCMTK开源库介绍&#xff1a; DCMTK是目前最全面实现DICOM3.0标准的开源库&#xff0c;通过结合DCMTK开源库和CxImage图像开源库&#xff0c;能够很方便的开发属于自己的DCM文件编辑浏览软件。 DCMT…

如何将C语言翻译成汇编语言,如何把汇编语言转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼程序:ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 1000HHOUR1 EQU 10hHOUR2 EQU 12hMIN1 EQU 14hMIN2 EQU 16hSEC1 EQU 18HCOUNT EQU 20HNUM1 EQU 22HNUM2 EQU 24HLL4 EQU 26Hs1 bit P1.0s2 bit P1.1s3 bit P1.2s4 bit P1.3A1 EQU 36…

数据库-Oracle【Oracle数据库设置默认表空间问题及Oracle,SQL,MySQL的自增变量设置】...

一、 Oracle数据库设置默认表空间问题 DBA们经常会遇到一个这样令人头疼的问题&#xff1a;不知道谁在Oracle上创建了一个用户&#xff0c;创建时&#xff0c;没有给这个用户指定默认表空间&#xff0c;所以这个用户就会采用默认的表空间——system表空间。导致系统表空间迅速被…

设计模式——Iterator模式实现研究

导读&#xff1a;软件设计模式是一种表达、记录和重用软件设计结构和设计经验的新方法&#xff0c;它对反复出现的设计结构的关键特征进行识别、抽象和命名&#xff0c;使重用成功设计和结构更加容易。本文介绍了软件设计模式的特点、描述方式以及在设计中使用模式带来的好处&a…

【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法&#xff08;http://support.dcmtk.org/docs/mod_dcmjpeg.html&#xff09;&#xff0c;代码摘录如下&#xff1a; DJDecoderRegistration::regist…

R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...

对于线性关系&#xff0c;我们可以进行简单的线性回归。对于其他关系&#xff0c;我们可以尝试拟合一条曲线。曲线拟合是构建一条曲线或数学函数的过程&#xff0c;它对一系列数据点具有最佳的拟合效果。使用示例数据集#我们将使Y成为因变量&#xff0c;X成为预测变量#因变量通…

认识IL

1.要编译的代码如下&#xff1a; using System; using System.Collections.Generic; using System.Text; namespace HellowWorld { class Program { static void Main() { Console.Write("Hello World!"); } } } 2…

c语言之多线程函数,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

Iterator模式

Iterator模式的几种用法 在网络上看帖子时发现不少模式的初学者对Iterator模式的理解仅仅停留在从类库的容器类取得Iterator来遍历容器中的内容的程度。 因此在这里写几个例子&#xff0c;来加深大家对Iterator模式的理解。 对容器中元素的访问涉及到3个方面。 1&#xff0e;容…

【转】DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8804736 dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中&#xff0c;学习了读取dcm文件的相关信息&#xff0c;如信息头MetaInformation元素、像素数据元素&#xff0c;只停留在了读…

设计模式C++实现 —— 外观模式、组合模式

外观模式应该是用的很多的一种模式&#xff0c;特别是当一个系统很复杂时&#xff0c;系统提供给客户的是一个简单的对外接口&#xff0c;而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统&#xff0c;而不需要关注内部复杂的结构。DP一书的定义&…

rsync的原理和安装使用及配制详解(三)(转)

5、示例脚本 这里这些脚本都是rsync网站上的例子&#xff1a; 1、每隔七天将数据往中心服务器做增量备份 #!/bin/sh# This script does personal backups to a rsync backup server. You will end up# with a 7 day rotating incremental backup. The incrementals will go# in…

单片机c语言控制显示器,单片机实现LCD液晶显示器控制原理..docx

摘 要LCD液晶显示已经是人机界面的关键技术。 本文对基于单片机的LCD夜晶显示器 控制系统进行了研究。首先在绪论中介绍了本课题的课题背景、 研究意义及完成的功能。本系统是以单 片机的基本语言C语言来进行软件设计&#xff0c;51的编程语言常用的有二种&#xff0c;一种是汇…

【转】DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8846337 背景介绍&#xff1a; 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档&#xff0c;写入数据库处理。由于医学图像的特殊性&#xff0c;每一个患者&#xff08;即所谓的Patient&#xff09;…

linux ( )含义,Linux的shell中$()、$[] 、${}分别是什么意思?

在bash中&#xff0c;$( )与 (反引号)都是用来作命令替换的。命令替换与变量替换差不多&#xff0c;都是用来重组命令行的&#xff0c;先完成引号里的命令行&#xff0c;然后将其结果替换出来&#xff0c;再重组成新的命令行。exp 1[rootlocalhost ~]# echo today is $(date &q…

导师评语(转)

星期一到了……小英在交完作业後&#xff0c;中午马上被老师叫去罚站&#xff0c;附加念500遍「我以後不敢编谎话欺骗老师了」。 why&#xff1f;为何这名老师要残忍的对待这名柔弱的小学生&#xff1f;我们来瞧瞧她的作文是怎麽写的…… ━━━━━━━━━━━━━━━━━━…

VxWorks平台下计算cpu的利用率

1、VxWorks的spyLib库提供的spy工具的实现原理。 Spy利用辅助定时器来产生中断&#xff0c;并且为每个任务维护一个计数器。然后记下被中断的任务&#xff0c;并且将该任务的计数器加一。经过一段时间后&#xff0c;每个任务的计数器反映了该任务占用CPU利用率的情况。很明显&a…

【转】DCMTK开源库类继承结构与DICOM3.0标准元素定义的对应关系图

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/9275271 最近由于课题需要&#xff0c;拿出来一些时间阅读了下DICOM3.0标准。在处理相关的DCM医学图像时使用了DCMTK开源库&#xff0c;废话不多说&#xff0c;直接贴图&#xff1a; 图一&#xff1a;DCMTK开…