本教程展示了如何使用封装的封装和提取文档文档信息对象定义(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封装文件的话题。
在Visual Studio中,创建一个新的Windows WinForms c#项目,并添加以下必要LEADTOOLS引用。
的引用需要取决于项目的目的。引用可以通过添加一个或另一个下面的两种方法(但不是全部)。
如果使用NuGet引用,本教程需要以下NuGet包:
Leadtools.Dicom.Pacs.Scu
如果使用本地DLL的引用,下面的DLL是必要的。
dll位于< INSTALL_DIR > \ LEADTOOLS22 \ Bin \ Dotnet4 \ x64
:
Leadtools.dll
Leadtools.Dicom.dll
Leadtools.Document.dll
对于一个完整的列表的应用程序所需的DLL文件,请参考文件包含在您的应用程序。
许可解锁项目需要的特性。它必须设置工具箱函数被调用之前。详情,包括教程为不同的平台,请参考设置一个运行时许可。
有两种类型的运行时许可证:
请注意
添加LEADTOOLS NuGet和本地引用设置许可中会详细介绍添加引用和设置一个许可证教程。
与项目创建、添加引用,许可,可以开始编码。
在解决方案资源管理器,双击Form1.cs
显示它的设计师。从工具箱添加以下控制:
typeComboBox
,以下值项目集合:burnedInAnnComboBox
,以下值项目集合:verificationFlagComboBox
,以下值项目集合:instanceNumberTextBox
contentDateTextBox
contentTimeTextBox
acquisitionDateTextBox
acquisitionTimeTextBox
documentTitleTextBox
HL7InstanceIdentifierTextBox
codingSchemeDesignatorTextBox
codeValueTextBox
codeMeaningTextBox
mimeTypesTextBox
,多行属性设置为真正的encapsulateButton
与文本封装的文件extractButton
与文本提取文档clearButton
与文本清晰的标签控制陪文本框控制和显示适当的输入的日期和时间格式输入。
设置启用财产所有文本框,组合框,按钮控制错误,这样应用程序使他们只有当DICOM数据集加载。
添加使用
下面的语句。
/ /使用块
使用Leadtools;
使用Leadtools.Dicom;
使用系统;
使用先;
使用System.Windows.Forms;
添加下面的全局变量Form1
类。
私人DicomDataSet _dicomDS;
私人MemoryStream _docStream;
在解决方案资源管理器,双击Form1.cs
显示它的设计师。单击事件图标属性窗口。然后,双击负载创建一个事件处理程序如果不存在。这将弹出背后的代码形式。
添加以下代码内部Form1_Load
事件处理程序来启动的DicomEngine
对象。
私人无效Form1_Load (对象发送方的EventArgs e)
{
DicomEngine.Startup ();
}
添加一个MenuStrip从工具箱中,添加一个DICOM菜单的形式负载菜单项。将文本设置为和装,把新项目的名称loadToolStripMenuItem
。
双击负载菜单项来编辑它的事件处理程序。添加以下代码:
私人无效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数据集。如果所选择的数据集包含一个封装的文档,它显示了文档格式的信息,提取封装文件内存流,和禁用编辑的控件。的提取文档按钮启用。
如果加载数据集不包含一个封装文档,应用程序可以允许输入的信息和控件封装的文件按钮启用。
启用和禁用编辑的代码的控制如下:
私人无效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 =真正的;
}
下面的代码封装文件提取到一个内存流和显示文档的表单控件的信息。
私人无效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;
}
下面的代码将提示用户封装文件的副本保存到磁盘。
私人无效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);
}
}
}
下面的代码封装文件从磁盘使用文档信息输入到表单。
私人无效encapsulateButton_Click (对象发送方的EventArgs e)
{
OpenFileDialog openDocumentDialog =新OpenFileDialog ();
openDocumentDialog。InitialDirectory =@“C: \ LEADTOOLS22 \ Resources \图片”;
如果(typeComboBox。SelectedIndex = = 0)/ / PDF
openDocumentDialog。过滤器=“可移植文档格式(pdf格式)| * . pdf”;
其他的如果(typeComboBox。SelectedIndex = = 1)/ / CDA
openDocumentDialog。过滤器=“临床文档体系结构格式(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数据集加载。
私人无效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引擎和清除内存流。
私人无效Form1_FormClosing (对象发送方,FormClosingEventArgs e)
{
DicomEngine.Shutdown ();
_docStream.Close ();
}
按运行项目F5,或通过选择调试- >开始调试。
如果遵循正确的步骤,应用程序,允许用户负载DICOM数据集。
如果数据集包含一个封装的文档,应用程序显示表单中的信息,并允许文档被保存到磁盘。如果数据集不包含和封装的文件,用户可以封装后文档形式提供必要的信息。
本教程演示了如何使用DicomEncapsulatedDocument
和DicomDataSet
类来提取和DICOM数据集的写私人数据元素。