封装DICOM文件——WinForms c#

本教程展示了如何使用封装的封装和提取文档文档信息对象定义(IOD) DICOM文件在c# WinForms应用程序。

概述
总结 本教程介绍了如何使用DICOM数据集封装和提取文档在WinForms c#应用程序。
完成时间 30分钟
Visual Studio项目 下载教程项目(KB) 14日
平台 Windows WinForms c#应用程序
IDE Visual Studio 2019
开发许可 下载LEADTOOLS

所需的知识

熟悉基本的步骤创建一个项目的审查添加引用和设置一个许可证教程,在工作之前封装DICOM文件——WinForms c#教程。

封装文档信息对象

封装的规范文档中列出的信息对象第3部分部分A.45DICOM标准的。

两种类型的文档可以封装在DICOM数据集:

更多细节封装文档模块中可以找到使用DICOM封装文件的话题。

创建项目并添加LEADTOOLS引用

在Visual Studio中,创建一个新的Windows WinForms c#项目,并添加以下必要LEADTOOLS引用。

的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。

如果使用NuGet引用,本教程需要以下NuGet包:

如果使用本地DLL的引用,下面的DLL是必要的。

dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64:

对于一个完整的列表的应用程序所需的DLL文件,请参考文件包含在您的应用程序

设置许可文件

许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可

有两种类型的运行时许可证:

请注意

添加LEADTOOLS NuGet和本地引用设置许可中会详细介绍添加引用和设置一个许可证教程。

创建表单控件

与项目创建、添加引用,许可,可以开始编码。

解决方案资源管理器,双击Form1.cs显示它的设计师。从工具箱添加以下控制:

设置启用财产所有文本框,组合框,按钮控制错误,这样应用程序使他们只有当DICOM数据集加载。

负载DICOM和检查文档封装

添加使用下面的语句。

c#
/ /使用块使用Leadtools;使用Leadtools.Dicom;使用系统;使用先;使用System.Windows.Forms;

添加下面的全局变量Form1类。

c#
私人DicomDataSet _dicomDS;私人MemoryStream _docStream;

解决方案资源管理器,双击Form1.cs显示它的设计师。单击事件图标属性窗口。然后,双击负载创建一个事件处理程序如果不存在。这将弹出背后的代码形式。

添加以下代码内部Form1_Load事件处理程序来启动的DicomEngine对象。

c#
私人无效Form1_Load (对象发送方的EventArgs e){DicomEngine.Startup ();}

添加一个MenuStrip从工具箱中,添加一个DICOM菜单的形式负载菜单项。将文本设置为和装,把新项目的名称loadToolStripMenuItem

双击负载菜单项来编辑它的事件处理程序。添加以下代码:

c#
私人无效loadToolStripMenuItem_Click (对象发送者,系统。EventArgs e){/ /加载数据集_dicomDS =DicomDataSet ();OpenFileDialog openDialog =OpenFileDialog ();openDialog。在itialDirectory =@“C: \ LEADTOOLS22 \资源\ \ DICOM图像”;openDialog。过滤器=“DICOM数据集(.dcm) | * .dcm”;如果(openDialog.ShowDialog ()= = DialogResult.OK){_dicomDS.Load (openDialog。文件名,DicomDataSetLoadFlags.None);DicomElement encapsulatedDocElement = _dicomDS.FindFirstElement (DicomTag.EncapsulatedDocument,真正的);/ /启用控制foreach(控制孩子控制)如果(child.GetType () = =typeof(文本框)| | child.GetType () = =typeof(按钮)| | child.GetType () = =typeof(组合框))的孩子。启用了=真正的;如果(encapsulatedDocElement ! =){DisableEditing ();GetEncapsulatedDocInfo (encapsulatedDocElement);/ /启用提取文档封装encapsulateButton。启用了=;extractButton。启用了=真正的;}其他的/ /没有封装的文档{EnableEditing ();/ /启用封装文件的封装encapsulateButton。启用了=真正的;extractButton。启用了=;}}}

这显示了一个打开文件对话框加载从磁盘DICOM数据集。如果所选择的数据集包含一个封装的文档,它显示了文档格式的信息,提取封装文件内存流,和禁用编辑的控件。的提取文档按钮启用。

如果加载数据集不包含一个封装文档,应用程序可以允许输入的信息和控件封装的文件按钮启用。

启用和禁用编辑的代码的控制如下:

c#
私人无效EnableEditing (){foreach(控制孩子控制){如果(child.GetType () = =typeof(文本框){(子作为文本框).Clear ();(子作为文本框)。只读的=;}如果(child.GetType () = =typeof(组合框)){(子作为组合框)。DropDownStyle = ComboBoxStyle.DropDownList;(子作为组合框)。KeyDown - = Form1_KeyDown;(子作为组合框)。SelectedIndex = 1;}}}私人无效DisableEditing (){foreach(控制孩子控制){如果(child.GetType () = =typeof(文本框)(子作为文本框)。只读的=真正的;如果(child.GetType () = =typeof(组合框)){(子作为组合框)。DropDownStyle = ComboBoxStyle.Simple;(子作为组合框)。KeyDown + = Form1_KeyDown;}}}私人无效Form1_KeyDown (对象发送方,KeyEventArgs e){e。SuppressKeyPress =真正的;}

解析封装文档信息

下面的代码封装文件提取到一个内存流和显示文档的表单控件的信息。

c#
私人无效GetEncapsulatedDocInfo (DicomElement encapsulatedDocElement){DicomEncapsulatedDocument encapsulatedDocument =DicomEncapsulatedDocument ();DicomCodeSequenceItem conceptNameCodeSequence =DicomCodeSequenceItem ();_docStream =MemoryStream ();/ /封装文件_dicomDS.GetEncapsulatedDocument (encapsulatedDocElement,encapsulatedDocument _docStream conceptNameCodeSequence);/ /文件类型开关(encapsulatedDocument.Type){情况下DicomEncapsulatedDocumentType.Pdf:typeComboBox。SelectedIndex = 0;/ / PDF打破;情况下DicomEncapsulatedDocumentType.Cda:typeComboBox。SelectedIndex = 1;/ / CDA打破;默认的:typeComboBox。文本=“未知”;/ /未知打破;}/ /实例数量instanceNumberTextBox。文本=encapsulatedDocument。在stanceNumber.ToString();/ /内容日期contentDateTextBox。文本=encapsulatedDocument.ContentDate.Month.ToString (“D2”)+“- - -”+ encapsulatedDocument.ContentDate.Day.ToString (“D2”)+“- - -”+ encapsulatedDocument.ContentDate.Year.ToString (“D4”);/ /内容时间intcontentDateTimeMicroseconds = encapsulatedDocument.ContentTime。分数/ 1000;contentTimeTextBox。文本=encapsulatedDocument.ContentTime.Hours.ToString (“D2”)+“:”+ encapsulatedDocument.ContentTime.Minutes.ToString (“D2”)+“:”+ encapsulatedDocument.ContentTime.Seconds.ToString (“D2”)+“。”+ contentDateTimeMicroseconds.ToString (“D3”);/ /获取日期acquisitionDateTextBox。文本=encapsulatedDocument.AcquisitionDateTime.Month.ToString (“D2”)+“- - -”+ encapsulatedDocument.AcquisitionDateTime.Day.ToString (“D2”)+“- - -”+ encapsulatedDocument.AcquisitionDateTime.Year.ToString (“D4”);/ /获取时间intacquisitionDateTimeMicroseconds = encapsulatedDocument.AcquisitionDateTime。分数/ 1000;acquisitionTimeTextBox。文本=encapsulatedDocument.AcquisitionDateTime.Hours.ToString (“D2”)+“:”+ encapsulatedDocument.AcquisitionDateTime.Minutes.ToString (“D2”)+“:”+ encapsulatedDocument.AcquisitionDateTime.Seconds.ToString (“D2”)+“。”+ acquisitionDateTimeMicroseconds.ToString (“D3”);/ /被注释如果(encapsulatedDocument。BurnedInAnnotation = =“不”)burnedInAnnComboBox。SelectedIndex = 0;其他的burnedInAnnComboBox。SelectedIndex = 1;/ /文档标题documentTitleTextBox。文本=encapsulatedDocument。文档Title;/ /验证标志如果(encapsulatedDocument。VerificationFlag = =“未经证实的”)verificationFlagComboBox。SelectedIndex = 0;其他的verificationFlagComboBox。SelectedIndex = 1;/ / HL7国旗标识符HL7InstanceIdentifierTextBox。文本=encapsulatedDocument。HL7InstanceIdentifier;/ / MIME类型mimeTypesTextBox。行= encapsulatedDocument.GetListOfMimeTypes ();/ /概念名称代码序列codingSchemeDesignatorTextBox。文本=conceptNameCodeSequence。CodingSchemeDesignator;codeValueTextBox。文本=conceptNameCodeSequence。CodeValue;codeMeaningTextBox。文本=conceptNameCodeSequence。CodeMeaning;}

提取压缩文档

下面的代码将提示用户封装文件的副本保存到磁盘。

c#
私人无效extractButton_Click (对象发送方的EventArgs e){SaveFileDialog saveDialog =SaveFileDialog ();saveDialog。在itialDirectory =@ " C: \ LEADTOOLS22 \资源\ \图片”;saveDialog。文件名= documentTitleTextBox.Text;如果(typeComboBox。文本= =“PDF”)saveDialog。过滤器=“可移植文档格式(pdf格式)| * . pdf”;其他的如果(typeComboBox。文本= =“CDA”)saveDialog。过滤器=“临床文档体系结构格式(xml) | * . xml”;如果(saveDialog.ShowDialog ()= = DialogResult.OK){试一试{使用(文件流fs =(saveDialog FileStream。文件名,FileMode.Create))_docStream.WriteTo (fs);MessageBox.Show (“封装文件保存”);}(异常交货){MessageBox.Show (ex.Message);}}}

封装的文件

下面的代码封装文件从磁盘使用文档信息输入到表单。

c#
私人无效encapsulateButton_Click (对象发送方的EventArgs e){OpenFileDialog openDocumentDialog =OpenFileDialog ();openDocumentDialog。InitialDirectory =@“C: \ LEADTOOLS22 \ Resources \图片”;如果(typeComboBox。SelectedIndex = = 0)/ / PDFopenDocumentDialog。过滤器=“可移植文档格式(pdf格式)| * . pdf”;其他的如果(typeComboBox。SelectedIndex = = 1)/ / CDAopenDocumentDialog。过滤器=“临床文档体系结构格式(xml) | * . xml”;其他的{MessageBox.Show (“选择文档类型第一。”);返回;}如果(openDocumentDialog.ShowDialog ()= = DialogResult.OK){DicomEncapsulatedDocument encapsulatedDocument =DicomEncapsulatedDocument ();/ /文件类型开关(typeComboBox.SelectedIndex){情况下0:encapsulatedDocument。类型= DicomEncapsulatedDocumentType.Pdf;打破;情况下1:encapsulatedDocument。类型= DicomEncapsulatedDocumentType.Cda;打破;默认的:encapsulatedDocument。类型= DicomEncapsulatedDocumentType.Unknown;打破;}/ /实例数量试一试{encapsulatedDocument。InstanceNumber =int.Parse (instanceNumberTextBox.Text);}(异常){MessageBox.Show (“无法解析实例数量。输入一个有效的价值”);返回;}/ /内容的日期和时间试一试{字符串contentDateTimeString = contentDateTextBox。文本+' '+ contentTimeTextBox.Text;DateTime contentDateTime = DateTime.ParseExact (contentDateTimeString,”;HH: mm: ss.fff”,System.Globalization.CultureInfo (“en - us”));encapsulatedDocument。ContentDate =DicomDateValue (contentDateTime);encapsulatedDocument。ContentTime =DicomTimeValue (contentDateTime);}(FormatException){MessageBox.Show (“无法解析内容日期/时间。一定要遵循显示格式”);返回;}/ /获取日期和时间试一试{字符串acquisitionDateTimeString = acquisitionDateTextBox。文本+' '+ acquisitionTimeTextBox.Text;DateTime acquisitionDateTime = DateTime.ParseExact (acquisitionDateTimeString,”;HH: mm: ss.fff”,System.Globalization.CultureInfo (“en - us”));encapsulatedDocument。AcquisitionDateTime =DicomDateTimeValue (acquisitionDateTime);}(FormatException){MessageBox.Show (“无法解析收购日期/时间。一定要遵循显示格式”);返回;}/ /被注释如果(burnedInAnnComboBox。SelectedIndex ! = 1)encapsulatedDocument。BurnedInAnnotation = burnedInAnnComboBox.Text;其他的{MessageBox.Show (“无法解析焚烧注释。从下拉列表中选择一个值”);返回;}/ /文档标题encapsulatedDocument。文档Title = documentTitleTextBox.Text;/ /验证标志encapsulatedDocument。VerificationFlag = verificationFlagComboBox.Text;/ / HL7实例标识符如果(typeComboBox。文本= =“CDA”& &字符串.IsNullOrEmpty (HL7InstanceIdentifierTextBox.Text)){MessageBox.Show (“无法解析HL7实例标识符。输入一个有效的价值”);返回;}其他的encapsulatedDocument。HL7InstanceIdentifier = HL7InstanceIdentifierTextBox.Text;/ /文档的Mime类型字符串[]mimetype = mimeTypesTextBox.Lines;encapsulatedDocument.SetListOfMimeTypes (mimetype);/ /概念名称代码序列DicomCodeSequenceItem conceptNameCodeSequence =DicomCodeSequenceItem ();conceptNameCodeSequence。CodingSchemeDesignator = codingSchemeDesignatorTextBox.Text;conceptNameCodeSequence。CodeValue = codeValueTextBox.Text;conceptNameCodeSequence。CodeMeaning = codeMeaningTextBox.Text;/ /封装加载文档加载DICOM数据集= _dicomDS.FindFirstElement DicomElement元素(DicomTag.EncapsulatedDocument,真正的);_dicomDS.SetEncapsulatedDocument(元素,,openDocumentDialog。文件名,encapsulatedDocument conceptNameCodeSequence);MessageBox.Show (“文档”+ openDocumentDialog。文件名+“已经被封装在加载数据集。按OK保存数据集”);SaveFileDialog saveDicomDialog =SaveFileDialog ();saveDicomDialog。在itialDirectory =@“C: \ LEADTOOLS22 \资源\ \ DICOM图像”;saveDicomDialog。过滤器=“DICOM数据集(.dcm) | * .dcm”;如果(saveDicomDialog.ShowDialog ()= = DialogResult.OK)_dicomDS.Save (saveDicomDialog。文件名,DicomDataSetSaveFlags.None);MessageBox.Show (“数据集保存完整的”);}}

清晰的按钮和关闭

下面的代码重置控制和DICOM数据集加载。

c#
私人无效clearButton_Click (对象发送方的EventArgs e){/ /加载数据集如果(_dicomDS ! =)_dicomDS =;/ /重置表单控件foreach(控制孩子控制){如果(child.GetType () = =typeof(文本框){(子作为文本框).Clear ();(子作为文本框)。只读的=;}如果(child.GetType () = =typeof(组合框)){(子作为组合框)。DropDownStyle = ComboBoxStyle.DropDownList;(子作为组合框)。KeyDown - = Form1_KeyDown;(子作为组合框)。SelectedIndex = 1;}如果(child.GetType () = =typeof(文本框)| | child.GetType () = =typeof(按钮)| | child.GetType () = =typeof(组合框))的孩子。启用了=;}}

解决方案资源管理器,双击Form1.cs显示它的设计师。单击事件图标属性窗口。然后,双击FormClosing事件。

使用下面的代码来关闭DICOM引擎和清除内存流。

c#
私人无效Form1_FormClosing (对象发送方,FormClosingEventArgs e){DicomEngine.Shutdown ();_docStream.Close ();}

运行该项目

按运行项目F5,或通过选择调试- >开始调试

如果遵循正确的步骤,应用程序,允许用户负载DICOM数据集。

如果数据集包含一个封装的文档,应用程序显示表单中的信息,并允许文档被保存到磁盘。如果数据集不包含和封装的文件,用户可以封装后文档形式提供必要的信息。

总结

本教程演示了如何使用DicomEncapsulatedDocumentDicomDataSet类来提取和DICOM数据集的写私人数据元素。

另请参阅

net
iOS
188金宝搏的网址客服|支持|联系我们|知识产权的通知
©1991 - 2022领先的技术公司。保留所有权利。