版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章fo-dicom类库实验中的几个问题私有数据元素VM:1,1-3,3~3n怎么用通配符的Tag:3.1概述FellowOakDicom(fo-dicom)是一个开源的C#语言编写的DICOM类库,提供对DICOM数据元素与数据集、消息服务元素、服务类、文件、图像显示等的支持。fo-dicom主要有以下特点。(1)目标平台为.NETStandard2.0,包括.NETFramework4.6.2、.NETCore6.0和7.0。(2)被存储为DICOM数据字典。(3)高性能,完全支持async/await异步API。(4)能实现JPEG(含lossless)、JPEG-LS、JPEG2000及RLE压缩算法(通过附加包)。(5)按需加载,支持极大数据集。(6)具有平台特定的图像渲染。(7)JSON/XML导入、导出。(8)支持匿名。(9)开源,MicrosoftPublicLicense(MS-PL)。3.1.1主要特点(1)目标平台为.NETStandard2.0,包括.NETFramework4.6.2、.NETCore6.0和7.0。(2)被存储为DICOM数据字典。(3)高性能,完全支持async/await异步API。(4)能实现JPEG(含lossless)、JPEG-LS、JPEG2000及RLE压缩算法(5)按需加载,支持极大数据集。(6)具有平台特定的图像渲染。(7)JSON/XML导入、导出。(8)支持匿名。(9)开源,MicrosoftPublicLicense(MS-PL)。3.1.2fo-dicom包包(Package)描
述fo-dicom包含解析器、服务和工具的核心包fo-dicom.Codecs跨平台DICOM编解码库,EfferentHealth开发fo-dicom.Imaging.Desktop渲染为位图的System.Drawing库fo-dicom.Imaging.ImageSharp能用于平台无关渲染的ImageSharp库fo-dicom.NLog使fo-dicom能用NLog记录日志的.NET连接器3.1.3fo-dicom核心程序集程序集(Assembly)描
述FellowOakDicomDICOM核心类FellowOakDicom.ImagingDICOM图像相关类FellowOakDicom.Imaging.AlgorithmsDICOM图像算法类FellowOakDicom.Imaging.CodecDICOM图像编解码类FellowOakDicom.Imaging.Codec.JpegDICOM图像JPEG编解码类FellowOakDicom.Imaging.Codec.JpegLosslessDICOM图像JPEGLossless编解码类FellowOakDicom.Imaging.LUTDICOM图像查找表类FellowOakDicom.Imaging.MathematicsDICOM图像运算相关类FellowOakDicom.Imaging.ReconstructionDICOM图像重建相关类FellowOakDicom.Imaging.RenderDICOM图像渲染相关类程序集(Assembly)描
述FellowOakDicom.IODICOM输入输出类FellowOakDicom.IO.BufferDICOM输入输出缓存类FellowOakDicom.IO.ReaderDICOM输入输出流读出类FellowOakDicom.IO.WriterDICOM输入输出流写入类FellowOakDicom.Log日志相关类FellowOakDicom.MediaDICOM介质存储相关类FellowOakDicom.NetworkDICOM网络通信相关类FellowOakDicom.Network.ClientDICOM网络通信相关类FellowOakDicom.Network.TLSDICOM传输层安全相关类FellowOakDicom.PrintingDICOM打印相关类FellowOakDicom.Serialization串行化相关类FellowOakDicom.StructuredReport结构化报告相关类FellowOakDicom.Tools工具类集合3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.1DicomTag类用(组号,元素号)一对16位数唯一确定一个数据元素。偶数组号的为标准数据元素,奇数组号的为私有数据元素。Tag通过DicomTag类合并实现,用IsPrivate属性判断数据元素是否私有,用PrivateCreator属性区分不同的私有创建者,为方便使用,DicomTag类还实现了下列接口:IformattableIEquatable<DicomTag>IComparable<DicomTag>IComparable3.2.1DicomTag类类
别成
员
名类
型描
述属性Groupushort组号Elementushort元素号IsPrivatebool是否私有(Group.IsOdd())PrivateCreatorDicomPrivateCreator存取私有创建者对象DictionaryEntryDicomDictionaryEntry引用数据字典中对应的数据元素方法ToStringstring获取字符串表示ParseDicomTag将字符串参数解析为DicomTag,若解析出错则抛出异常Tag是一对数字,不易记忆,对于上层程序开发来说很不方便,在DicomTag类中定义了所有数据元素的名称所对应的对象常量,实现了按名引用如DicomTag.SpecificCharacterSet就对应了Tag为(0008,0005)的DicomTag类实例。由于数据元素数量巨大且随着版本号的变化而变化,所以这部分通过程序生成技术从数据字典文本中生成。publicpartialclassDicomTag{...///<summary>(0008,0001)VR=ULVM=1LengthtoEnd(RETIRED)</summary>publicreadonlystaticDicomTagLengthToEndRETIRED=newDicomTag(0x0008,0x0001);///<summary>(0008,0005)VR=CSVM=1-nSpecificCharacterSet</summary>publicreadonlystaticDicomTagSpecificCharacterSet=newDicomTag(0x0008,0x0005);...///<summary>(60xx,0010)VR=USVM=1OverlayRows</summary>publicreadonlystaticDicomTagOverlayRows=newDicomTag(0x6000,0x0010);///<summary>(60xx,0011)VR=USVM=1OverlayColumns</summary>publicreadonlystaticDicomTagOverlayColumns=newDicomTag(0x6000,0x0011);...}3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.2DicomMaskedTag类数据元素中还有一些Tag带有“x”,如(60xx,0010),每一个“x”代表任意一位十六进制数,称为通配Tag因为其组号或元素号都不能直接存为16进制短整型,所以其解析比较等操作均需特殊处理,单独用DicomMaskedTag类来处理3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.3DicomVM类在数据字典中,VM列规定了某一数据元素是否允许多值及值的个数限定范围,如“1”“1-3”“2-n”“3-3n”等,用DicomVM类实现。属性Minimum表示最小值,属性Multiplicity乘以Maximum表示最大值三个属性均为int类型,“n”就用int.MaxValue常量(2147483647)表示。DicomVM类还提供了Parse和ToString方法实现字符串与数字的转换内置的字段_vm用来避免重复DicomVM类还定义了各种VM常量publicstaticreadonlyDicomVMVM_1=DicomVM.Parse("1");publicstaticreadonlyDicomVMVM_1_2=DicomVM.Parse("1-2");...publicstaticreadonlyDicomVMVM_3_n=DicomVM.Parse("3-n");publicstaticreadonlyDicomVMVM_3_3n=DicomVM.Parse("3-3n");...3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.4DicomUID类UID规定了DICOM术语、传输语法、SOP类、服务类等的唯一标识符,是数据字典的组成部分fo-dicom设计了DicomUID类用来保存UID数据字典类
别成
员
名类
型描
述字段_uidsIDictionary<string,DicomUID>UID数据字典,对应DicomUID对象属性RootUIDstring分配UID的根UIDstring唯一标识符,绑定私有字段_uids,只读Namestring名称,绑定私有字段_name,只读TypeDicomUidType类别,绑定私有字段_type,枚举DicomUidType取值有TransferSyntax、SOPClass、MetaSOPClass、ServiceClass、SOPInstance、ApplicationContextName、ApplicationHostingModel、CodingScheme、FrameOfReference、LDAP、MappingResource、ContextGroupName、UnknownIsRetiredbool是否已失效,绑定私有字段_retired,只读StorageCategoryDicomStorageCategory存储类别,枚举DicomStorageCategory取值有None、Image、PresentationState、StructuredReport、Waveform、Document、Raw、Other、Private、VolumeIsImageStoragebool存储类别是否为图像IsVolumeStoragebool存储类别是否为容积类
别成
员
名类
型描
述方法Registervoid向数据字典中添加DicomUID对象GenerateDicomUID为SOP实例分配一随机UID并创建对象AppendDicomUID为SOP实例创建一顺序UID对象IsValidUidbool判断参数传入的UID是否符合语法ParseDicomUID在UID数据字典中查找字符串参数指定的UID对象,返回对象;如果找不到,则返回Unknown对象GetHashCodeint获取UID的哈希值ToStringstring以名称[UID]格式返回字符串UID是一串数字,对于上层程序开发来说很不方便,因此在DicomUID类中定义了所有数据字典中UID名称对应的对象常量,实现了按名引用如DicomUID.Verification就对应了UID为“1.2.840.10008.1.1”验证SOP类的DicomUID对象常量。在构造函数中把所有DicomUID对象常量以UID为关键字添加到_uids数据字典中publicpartialclassDicomUID{...///<summary>SOPClass:VerificationSOPClass</summary>publicreadonlystaticDicomUIDVerification=newDicomUID( "1.2.840.10008.1.1", "VerificationSOPClass", DicomUidType.SOPClass, false);///<summary>TransferSyntax:ImplicitVRLittleEndian</summary>publicreadonlystaticDicomUIDImplicitVRLittleEndian=newDicomUID( "1.2.840.10008.1.2", "ImplicitVRLittleEndian:DefaultTransferSyntaxforDICOM", DicomUidType.TransferSyntax, false);...}类
实
例属
性UIDNameTypeIsRetiredImplicitVRLittleEndian1.2.840.10008.1.2ImplicitVRLittleEndian:DefaultTransferSyntaxforDICOM.TransferSyntaxfalseExplicitVRLittleEndian1.2.840.1000ExplicitVRLittleEndian.TransferSyntaxfalseExplicitVRBigEndianRetired1.2.840.1000ExplicitVRBigEndian(Retired).TransferSyntaxtrueDeflatedExplicitVRLittleEndian1.2.840.1000.99DeflatedExplicitVRLittleEndian.TransferSyntaxfalseJPEGBaseline11.2.840.1000.50JPEGBaseline(Process1):DefaultTransferSyntaxforLossyJPEG8BitImageCompression.TransferSyntaxfalse…………3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.5DicomTransferSyntax类传输语法规定了DICOM字节顺序是BE还是LE、值表示法是显式还是隐式,以及采用什么压缩算法等数据元素编解码基本问题。数据字典中规定了每种传输语法的UID标识,以DicomTransferSyntax类表示。DicomTransferSyntax类中:字节顺序属性Endian是Dicom.IO命名空间下处理字节顺序的一个工具类只有一个bool变量_isBigEndian,定义了Big、Little、LocalMachine、Network
4个Endian对象常量,各种数值类型的Swap方法用来改变字节顺序。类
别成
员
名类
型描
述字段EntriesIDictionary<DicomUID,DicomTransferSyntax>传输语法类对象的数据字典属性UIDDicomUID唯一标识符IsRetiredbool是否已失效IsExplicitVRbool是否显式VRIsEncapsulatedbool是否封装IsLossybool是否有损压缩LossyCompressionMethodstring有损压缩算法IsDeflatebool是否紧缩压缩EndianEndian字节顺序SwapPixelDatabool像素数据是否要交换顺序方法ToStringstring获取传输语法名ParseDicomTransferSyntax从参数UID字符串得到传输语法对象RegisterDicomTransferSyntax注册并返回UID指定的传输语法实例Unregisterbool通过传输语法实例或UID退出注册QueryDicomTransferSyntax根据UID查询传输语法实例LookupDicomTransferSyntax从参数UID得到传输语法对象类中为每一种传输语法实例化了静态对象,各实例的属性取值见表3.7类的构造函数把这些静态传输语法对象添加到了Entries数据字典中,以方便使用///<summary>ExplicitVRLittleEndian</summary>publicstaticDicomTransferSyntaxExplicitVRLittleEndian=newDicomTransferSyntax{UID=DicomUID.ExplicitVRLittleEndian,IsExplicitVR=true,Endian=Endian.Little};...///<summary>JPEG2000LossyImageCompression</summary>publicstaticDicomTransferSyntaxJPEG2000Lossy
=newDicomTransferSyntax{UID=DicomUID.JPEG2000,IsExplicitVR=true,IsEncapsulated=true,IsLossy=true,LossyCompressionMethod="ISO_15444_1",Endian=Endian.Little};...类
实
例属
性UID①IsRetiredIsExplicitVRIsEncapsulatedIsLossyLossyCompr-essionMethodEndianImplicitVRLittleEndian.ImplicitVRLittleEndianfalsefalsefalsefalse
.LittleExplicitVRLittleEndian.ExplicitVRLittleEndianfalsetruefalsefalse
.LittleExplicitVRBigEndian.ExplicitVRBigEndianRETIREDfalsetruefalsefalse
.BigDeflatedExplicitVRLittleEndian.DeflatedExplicitVRLittleEndianfalsetruefalsefalse
.LittleJPEGProcess1.JPEGBaseline1falsetruetruetrueISO_10918_1.LittleJPEGProcess2_4.JPEGExtended24falsetruetruetrueISO_10918_1.LittleJPEGProcess3_5Retired.JPEGExtended35RETIREDtruetruetruetrueISO_10918_1.LittleJPEGProcess6_8Retired.JPEGSpectralSelectionNonHierarchical68RETIREDtruetruetruetrueISO_10918_1.LittleJPEGProcess7_9Retired.JPEGSpectralSelectionNonHierarchical79RETIREDtruetruetruetrueISO_10918_1.LittleJPEGProcess10_12Retired.JPEGFullProgressionNonHierarchical1012RETIREDtruetruetruetrueISO_10918_1.LittleJPEGProcess11_13Retired.JPEGFullProgressionNonHierarchical1113RETIREDtruetruetruetrueISO_10918_1.Little…………3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.6DicomVR类DicomVR类定义了VR的描述结构,包括值表示法的固有属性,以及不同传输语法下值表示法编解码所需的属性和方法,DicomVR类属性Code、Name、IsMultiValue、UnitSize、MaximumLength分别保存了VR的固有属性属性IsStringEncoded指明了该VR值域是否可以用(0008,0005)
SpecificCharacterSet数据元素指定的字符集编码;属性UnitSize用于OB、OD、OF、OL、OW等数组类型的VR,指示该数组的每一个元素的字节数在隐式VR传输语法下值长度域固定为4字节。显式VR传输语法下值长度域是否为2字节(否则跳过2字节0,值长度域为4字节),设置了Is16bitLength属性记录DicomVR类还具有方便使用的IsString属性来区分值域是用字符串表示还是用二进制数表示值域用二进制数表示时属性ByteSwap记载了改变字节顺序时的交换字节数(除AT外均与UnitSize一致)属性ValueType则指定了实际保存该VR值的C#数据类型名。类
别成
员
名类
型描
述属性CodestringVR代码NamestringVR名称IsStringbool是否用字符串表示IsStringEncodedbool是否用特定字符集编码字符串Is16bitLengthbool显式VR传输语法下值长度域是否为16位(2字节)短整型IsMultiValuebool值域是否允许多个值PaddingValuebyte用来使值域为偶数个字节的填充字符MaximunLengthuint单个值的最大长度UnitSizeint固定长度值类型的每个值单元大小ByteSwapint改变字节顺序时的交换字节数,通常与UnitSize一致ValueTypeType类型名StringValidatorAction<string>字符串验证器方法ToStringstring获取该VR的字符串表示ParseDicomVR将字符串参数解析为DicomVRTryParsebool将字符串参数解析为DicomVR时,若解析出错则抛出异常ValidateStringvoid调用验证器验证字符串例如,实例AE的声明如下:publicstaticreadonlyDicomVRAE=newDicomVR{Code=DicomVRCode.AE,Name="ApplicationEntity",IsString=true,IsStringEncoded=false,Is16bitLength=true,IsMultiValue=true,PaddingValue=PadSpace,MaximumLength=16,UnitSize=1,ByteSwap=1,ValueType=typeof(string)};DicomVRCode静态类定义了34种VR常量字符串,方便枚举使用publicstaticclassDicomVRCode{publicconststringAE="AE";///<summary>ApplicationEntity</summary>publicconststringAS="AS";///<summary>AgeString</summary>publicconststringAT="AT";///<summary>AttributeTag</summary>...publicconststringUS="US";///<summary>UnsignedShort</summary>publicconststringUT="UT";///<summary>UnlimitedText</summary>}类实例属
性Code①NameIsStringIsStringEncodedIs16bitLengthIsMultiValuePaddingValueMaximumLengthUnitSizeByteSwapValueTypeAE.AEApplicationEntitytruefalsetruetrue0x201611stringAS.ASAgeStringtruefalsetruetrue0x20411stringAT.ATAttributeTagfalsefalsetruetrue0x00442DicomTagCS.CSCodeStringtruefalsetruetrue0x201611stringDA.DADatetruefalsetruetrue0x20811datetimeDS.DSDecimalStringtruefalsetruetrue0x201611decimalDT.DTDateTimetruefalsetruetrue0x202611datetimeFD.FDFloatingPointDoublefalsefalsetruetrue0x00888doubleFL.FLFloatingPointSinglefalsefalsetruetrue0x00444floatIS.ISIntegerStringtruefalsetruetrue0x201211int…………3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.7数据字典类DicomDictionaryEntry类用来保存数据字典中的一行,属性Tag、Name、Keyword、ValueRepresentations、ValueMultiplicity、IsRetired分别对应数据字典中的一列。MaskTag是DicomMaskedTag类的实例,用来保存通配Tag。可以通过构造函数的参数得到各属性的初始值,类外部访问的各属性是只读的。publicsealedclassDicomDictionaryEntry{publicDicomTagTag{get;set;} //标记publicDicomMaskedTagMaskTag{get;privateset;} //掩码标记publicstringName{get;privateset;} //数据元素名publicstringKeyword{get;privateset;} //关键字publicDicomVR[]ValueRepresentations{get;privateset;} //值表示法publicDicomVMValueMultiplicity{get;privateset;} //值个数范围publicboolIsRetired{get;privateset;} //是否已失效...}DicomDictionary类将数据元素分为3类分别存储标准数据元素,加载在数据字典_entry中带有掩码标记的数据元素,加载在_masked列表中私有数据元素,每个创建者一个数据字典,通过_private数据字典索引到私有创建者字典数据字典的加载途径如下:(1)通过显式调用EnsureDefaultDictionariesLoaded方法加载内置的XML格式数据字典文件及私有数据字典文件(可选)。(2)通过Load方法从指定的XML文件中加载数据字典;(3)通过Default属性单次写入数据字典或读取时隐式加载数据字典。类别成
员
名类
型描
述字段UnknownTagDicomDictionaryEntry未知Tag,静态只读字段,作为数据字典索引失败的返回值PrivateCreatorTagDicomDictionaryEntry私有创建者数据元素,静态只读字段,作为元素号0x0001~0x00ff私有数据元素数据字典索引的返回值_creatorsConcurrentDictionary私有创建者对象的数据字典_privateConcurrentDictionary私有创建者数据字典的数据字典_entryConcurrentDictionary标准数据元素的数据字典_keywordsConcurrentDictionary关键字数据字典_maskedConcurrentBag<DicomDictionaryEntry>带掩码标记的数据元素列表属性DefaultDicomDictionary与_default字段绑定,存取默认数据字典的引用PrivateCreatorDicomPrivateCreator与_privateCreator字段绑定,存取当前私有创建者对象的引用索引器成
员
名类
型描
述this[DicomTag]DicomDictionaryEntry通过DicomTag对象索引数据字典中对应的数据元素this[DicomPrivateCreator]DicomDictionary通过DicomPrivateCreator对象索引到该私有创建者数据字典this[stringkeyword]Dicomtag用关键字查询DicomTag对象方法Addvoid将数据元素对象添加到数据字典GetPrivateCreatorDicomPrivateCreator获取(若不存在则先添加)参数字符串对应的私有创建者对象Loadvoid通过DicomDictionaryReader对象从参数指定的XML文件中加载各个数据元素EnsureDefaultDictionariesLoadedDicomDictionary确保默认DICOM数据字典加载成功GetEnumeratorIEnumerator<DicomDictionaryEntry>获取枚举器Add方法用来向数据字典中添加一条数据元素,至于添加到哪个数据字典是自动处理的。索引器this[DicomTag]可通过DicomTag对象透明索引数据元素,无须关心具体在哪个数据字典中,如果返回UnknownTag,则表示索引失败.3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.8数据元素类数据元素是DICOM数据组织的基本单位。对数据元素的基本操作就是在传输语法的规定下进行编码和解码。一个数据元素由标记、值表示法(隐式传输语法下没有这部分,由数据字典查得)、值长度和值域四部分组成前三部分的编解码完全由传输语法确定值域的编解码比较复杂,除传输语法外,还与值表示法VR密切相关,34种VR的编解码方法都不相同,因此可以定义34种数据元素类。1.数据元素类体系DicomItem类DicomSequence类(SQ)DicomElement类DicomAttributeTag类(AT)DicomValueElement类DicomSignedShort类(SS)、DicomSignedLong类(SL)、DicomSignedVeryLong类(SV)、DicomUnsignedShort类(US)、DicomUnsignedLong类(UL)、DicomUnsignedVeryLong类(UV)DicomFloatingPointSingle类(FL)、DicomFloatingPointDouble类(FD)、DicomOtherWord类(OW)、DicomOtherLong类(OL)、DicomOtherVeryLong类(OV)、DicomOtherFloat类(OF)、DicomOtherDouble类(OD)DicomOtherByte类(OB)DicomUnknown类(UN)DicomStringElement类DicomLongText类(LT)、DicomShortText类(ST)、DicomUniversalResource类(UR)、DicomUnlimitedText类(UT)DicomMultiStringElement类DicomApplicationEntity类(AE)、DicomAgeString类(AS)、DicomCodeString类(CS)、DicomDecimalString类(DS)、DicomIntegerString类(IS)、DicomLongString类(LO)、DicomPersonName类(PN)、DicomShortString类(SH)、DicomUnlimitedCharacters类(UC)、DicomUniqueIdentifier类(UI)DicomDateElement类DicomDate类(DA)、DicomDateTime类(DT)、DicomTime类(TM)2.类的成员DicomItem类定义了DicomTag类对象Tag属性抽象只读属性ValueRepresentation强制各具体子类返回其DicomVR对象重写ToString方法得到“TAGVRName”格式的字符串。2.类的成员DicomElement类为除SQ外的数据元素定义了IByteBuffer接口的Buffer属性和Length属性,用来保存值域抽象属性Count从子类得到值的个数抽象泛型方法Get<T>从子类读取值Validate方法验证值的个数是否超出VM规定的上下限。2.类的成员DicomValueElement类是一个泛型抽象类实现了Count属性计算Buffer.Size计算ValueRepresentation.UnitSize实现了Get<T>泛型方法,解码返回:单个数值数值类型的数组或者对应的对象、结构、字符串及其数组形式publicoverrideTGet<T>(intitem=-1){ if(item==-1)item=0; if(typeof(T)==typeof(object)){...//返回对象} if(typeof(T)==typeof(object[])){...//返回对象数组} if(typeof(T)==typeof(Tv)){...//返回Tv结构} if(typeof(T)==typeof(Tv[])){...//返回Tv结构数组} if(typeof(T)==typeof(string)){...//返回字符串} if(typeof(T)==typeof(string[])){...//返回字符串数组} if(typeof(T).GetTypeInfo().IsValueType){...//返回数值类型} thrownewInvalidCastException("Unabletoconvert...");//抛出异常}DicomStringElement类定义了Encoding对象数组的属性BufferEncodings和TargetEncodings;实现了Count只读属性(固定为1)定义了string类型的StringValue只读属性,得到了去除填充字符的Buffer字符串实现了Get<T>方法对StringValue按照T返回字符串或字符串数组ValidateString方法调用了VR对象的ValidateString方法对值做字符串验证。DicomMultiStringElement类扩展了DicomStringElement类增加了string[]类型_values私有字段的存放值数量重写了Count属性得到值的个数重写了Get<T>方法返回给定数组下标的字符串ValidateString方法调用了VR对象的ValidateString方法对值做字符串验证。DicomDateElement类定义了datetime[]类型的_values私有字段定义了string[]类型的DateFormats只读属性用来保存日期时间格式重写了Get<T>方法增加从Buffer中按照DateFormats格式解析出的datetime、datetime[]或DicomDateRange类型的日期值。数据元素具体类大部分的定义都只是在抽象类的基础上,简单地通过构造函数向基类传递参数实现ValueRepresentation只读属性得到DicomVR对象例如DicomOtherByte类返回DicomVR.OB,DicomUnknown类返回DicomVR.UN。少部分的数据元素具体类改写了Get<T>方法和增加了一些必要的属性3.DicomDataSet类数据集是数据元素的有序集合,由DicomDataSet类实现类中组合了DicomItem对象集合_items,以容纳包括SQ在内的各种数据元素,_items被初始化为SortedDictionary<DicomTag,DicomItem>对象定义了Add、AddOrUpdate、Remove、Clear、Contains、GetXXX<T>等常用方法多个Get方法相关的还有TryGet方法,当出现错误时可抛出异常。DicomDataset扩展类,新增了Clone、GetDateTime、EnumerateMasked、EnumerateGroup等方法类
别成
员
名类
型描
述字段_itemsIDictionary<DicomTag,DicomItem>容纳数据集中数据元素的数据字典_syntaxDicomTransferSyntax传输语法属性InternalTransferSyntaxDicomTransferSyntax与_syntax字段绑定,存取传输语法AutoValidatebool使能数据元素加入时的自动验证方法AddDicomDataset将数据元素对象、数组或集合添加到数据集DoAddDicomDataset将数据元素对象、数组或集合添加到数据集AddOrUpdateDicomDataset将数据元素对象、数组或集合添加到数据集,若已存在则更新AddOrUpdatePixelDataDicomDataset将图像像素数据添加到对象为数据集的PixelData数据元素,若已存在则更新RemoveDicomDataset把指定Tag的若干数据元素从数据集中移除ClearDicomDataset清空数据集GetValue<T>T获取Tag指定数据元素的值GetValueCountint获取Tag指定数据元素的值的个数GetValueOrDefault<T>T获取Tag指定数据元素的第几个值,如果该值不存在则返回所提供的默认值GetValues<T>T[]获取Tag指定数据元素的值数组GetSingleValue<T>T获取Tag指定数据元素的值,其VM必须是1类
别成
员
名类
型描
述方法GetSingleValueOrDefault<T>T获取Tag指定数据元素的值,如果该值不存在则返回所提供的默认值GetStringstring获取Tag指定数据元素值的字符串表示GetDicomItem<T>T获取指定Tag的数据元素GetSequenceDicomSequence获取指定Tag的SQGetCodeItemDicomCodeItem获取指定Tag的CodeItem对象GetReferencedSOPDicomReferencedSOP获取指定Tag的ReferencedSOP对象GetMeasuredValueDicomMeasuredValue获取指定Tag的MeasuredValue对象Validatevoid对数据集中所有数据元素做验证Containsbool检查数据集中是否包含指定Tag的数据元素CopyToDicomDataset把指定Tag的数据元素的引用复制到目标数据集ToStringstring显示数据集中数据元素数量统计值4.DicomSequence类SQ值表示法规定了数据元素值域可由多个条目(Item)构成,每个条目封装一个子数据集(其中有若干数据元素,包括SQ数据元素),形成了一种嵌套的数据结构。DicomSequence类的设计,有了DicomDataSet类就比较简单了SQ的值域由多个条目构成,每个条目可以用一个DicomDataSet对象来实现用IList<DicomDataset>类型的Items属性容纳这些条目定义了GetEnumerator方法(枚举访问Items)定义了Validate方法(对每个条目进行验证)5.数据集遍历类上层应用可以通过索引或枚举器访问数据集及列表,但是在编码、Dump时除了按序遍历每一个数据元素,还需要把SQ数据元素的条目结构反映出来fo-dicom设计了数据集遍历提供类DicomDatasetWalker和数据集遍历用户类的接口IDicomDatasetWalkerIDicomDatasetWalker接口在强制约束数据集遍历用户类时,需要实现规定的数据集结构遍历事件处理方法实现这个接口的数据集遍历用户类包括DicomDatasetWalker等publicinterfaceIDicomDatasetWalker{voidOnBeginWalk(); //遍历开始事件处理方法boolOnElement(DicomElementelement); //数据元素事件处理方法Task<bool>OnElementAsync(DicomElementelement); //异步数据元素事件处理方法boolOnBeginSequence(DicomSequencesequence); //列表开始事件处理方法boolOnBeginSequenceItem(DicomDatasetdataset); //条目开始事件处理方法boolOnEndSequenceItem(); //条目结束事件处理方法boolOnEndSequence(); //列表结束事件处理方法boolOnBeginFragment(DicomFragmentSequencefragment);//分段开始事件处理方法boolOnFragmentItem(IByteBufferitem); //分段条目事件处理方法Task<bool>OnFragmentItemAsync(IByteBufferitem); //异步分段条目事件处理方法boolOnEndFragment(); //分段结束事件处理方法voidOnEndWalk(); //遍历结束事件处理方法}DicomDatasetWalker类是实际进行数据集遍历的提供类,把数据集的开始、结束,每一个数据元素/列表的开始、结束,每一个条目的开始、结束事件都通过IDicomDatasetWalker接口通知数据集遍历用户类进行具体处理。定义了IEnumerable<DicomItem>类型的私有字段_dataset保存构造函数传入的数据集定义了Walk方法遍历数据集,先调用私有方法BuilderWalkQueue把数据集(特别是SQ)线性化为队列items定义私有的BeginDicomSequenceItem类、EndDicomSequenceItem类、EndDicomSequence类、DicomFragmentItem类及EndDicomFragment类等来插入SQ结构标记对象调用DoWalk私有方法从队列中逐个访问,触发参数传入的IDicomDatasetWalker对象的对应接口方法类中还提供了异步版本的WalkAsync方法和DoWalkAsync方法privatestaticvoidBuildWalkQueue(IEnumerable<DicomItem>dataset,Queue<DicomItem>items){foreach(varitemindataset){ //遍历数据集if(itemisDicomElement){ //数据元素直接入列items.Enqueue(item);}elseif(itemisDicomFragmentSequence){ //分段列表varsq=itemasDicomFragmentSequence;items.Enqueue(item); //直接入列foreach(varfragmentinsq){ //遍历各分段items.Enqueue(newDicomFragmentItem(fragment));//分段封装对象入列}items.Enqueue(newEndDicomFragment()); //分段结束对象入列
}elseif(itemisDicomSequence){ //列表varsq=itemasDicomSequence;items.Enqueue(item); //入列foreach(varsqiinsq){ //遍历列表各条目sqi.SetFallbackEncodings(dataset.GetEncodingsForSerialization());//设置编码sqi.OnBeforeSerializing(); //串行化开始事件items.Enqueue(newBeginDicomSequenceItem(sqi)); //列表条目开始对象入列BuildWalkQueue(sqi,items); //嵌套创建条目队列items.Enqueue(newEndDicomSequenceItem());//条目结束对象入列}items.Enqueue(newEndDicomSequence()); //列表结束对象入列}}}privatestaticvoidDoWalk(IDicomDatasetWalkerwalker,Queue<DicomItem>items){try{ walker.OnBeginWalk(); //遍历开始事件 while(items.Count>0){ //遍历数据集 varitem=items.Dequueue(); //元素出队列 if(itemisDicomElement){ //数据元素事件 walker.OnElement(itemasDicomElement); }elseif(itemisDicomFragmentSequence){ //分段列表开始事件walker.OnBeginFragment(itemasDicomFragmentSequence);}elseif(itemisDicomFragmentItem){ //分段条目开始事件walker.OnFragmentItem((itemasDicomFragmentItem).Buffer);}elseif(itemisEndDicomFragment){ //分段结束事件walker.OnEndFragment();}elseif(itemisDicomSequence){ //列表开始事件walker.OnBeginSequence(itemasDicomSequence);}elseif(itemisBeginDicomSequenceItem){ //条目开始事件walker.OnBeginSequenceItem((itemasBeginDicomSequenceItem).Dataset);}elseif(itemisEndDicomSequenceItem){ //条目结束事件walker.OnEndSequenceItem(); }elseif(itemisEndDicomSequence){ //列表结束事件walker.OnEndSequence(); }}walker.OnEndWalk(); //遍历结束事件}catch(Exceptione){……}}3.2Dicom核心程序集3.2.1DicomTag类3.2.2DicomMaskedTag类3.2.3DicomVM类3.2.4DicomUID类3.2.5DicomTransferSyntax类3.2.6DicomVR类3.2.7数据字典类3.2.8数据元素类3.2.9文件类3.2.9文件类Dicom文件组成文件头前导符DICM标识头元素数据集数据元素1.DicomFileMetaInformation类DicomFileMetaInformation类是保存文件头元素的类继承了DicomDataSet类定义了若干常用的文件头元素属性如:Version、TransferSyntax、ImplementationClassUID、ImplementationVersionName、MediaStorageSOPClassUID、MediaStorageSOPInstanceUID、SourceApplicationEntityTitle等。当SourceApplicationEntityTitle为空时默认取机器名的前16个字符作为源应用实体名称。2.DicomFile类DicomFile类是存储DICOM文件的类定义了File、Format、FilemetaInfo、Dataset、IsPartial属性定义了Save、SaveAsync、OpenAsync、HasValidHeader、ToString等公共方法在Open/Save过程中会用到Dicom.IO程序集中的DicomFileReader类和DicomFileWriter类DicomFile扩展类DicomFileExtensions类增加了DICOM文件深复制的Clone方法Dicom.Imaging.Codec命名空间下的DicomCodecExtensions类,增加了带有传输语法参数的转码复制Clone方法重载类
别成
员
名类
型描
述属性FileIFileReference文件FormatDicomFileFormat文件格式。DicomFileFormat枚举值有Unknown、DICOM3、DICOM3NoPreamble、DICOM3NoFileMetaInfo、ACRNEMA1、ACRNEMA2FileMetaInfoDicomFileMetaInformation文件头DatasetDicomDataset数据集IsPartialbool是否为文件部分方法Savevoid保存文件SaveAsyncasyncTask异步保存文件OpenstaticDicomFile打开文件OpenAsyncstaticasyncTask<DicomFile>异步打开文件HasValidHeaderstaticbool文件是否有“DICOM”标识ToStringstring输出“DICOMFile[格式]”字符串HandleOpenErrorvoid读文件出错时抛出异常PreprocessFileMetaInformationvoidSave时初始化文件头3.3Dicom.IO输入输出程序集3.3.1字节顺序类3.3.2字节缓冲区接口及类3.3.3字节对象类3.3.4DicomReader类3.3.5DicomWriteOption类与DicomWriter类3.3.6文件读写类3.4依赖注入3.4.1概述3.4.2依赖注入的原理3.4.3java依赖注入3.4.1概述依赖注入(DependencyInjection,DI)是控制反转思想的一种重要实现方式,其能将“创建和组装对象”操作的控制权从业务逻辑转移到框架中。当我们需要某个类型的对象时,由框架来提供这个对象,不需要关注此对象的创建过程,减小了模块之间的耦合度具有以下优点:1.解耦:依赖注入可以帮助我们将服务的创建和管理责任交给容器,这样服务实现类与其他类之间的依赖关系被解耦,使得代码更加灵活、易于维护和扩展。2.可测试:通过依赖注入,我们可以轻松地模拟和替换服务的实现类,从而在单元测试中更容易地测试代码。3.容易更换实现:在依赖注入中,我们可以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 1500字2024年度综合性服务承包协议模板版B版
- 2024年品牌产品销售代理协议样本版B版
- 江南大学《概率论与数理统计Ⅰ》2022-2023学年第一学期期末试卷
- 2024年度混合用地购买合同2篇
- 佳木斯大学《商务日语会话1》2021-2022学年第一学期期末试卷
- 2024年全新工作职责协议协议范本版
- 佳木斯大学《翻译理论与实践》2021-2022学年第一学期期末试卷
- 暨南大学《西班牙语视听说Ⅰ》2021-2022学年第一学期期末试卷
- 暨南大学《经济学原理》2021-2022学年第一学期期末试卷
- 暨南大学《古代中国与外来文明》2021-2022学年第一学期期末试卷
- 第16讲磁聚焦和磁发散(解析版)
- 第二章林分调查
- 2023年华三杯考试复习题库及答案
- 华能电力定员标准
- 英伦文学地图:英国文学中的地域书写知到章节答案智慧树2023年苏州大学
- 小学数学教师资格证面试真题及答案【版】
- 俄语口语入门知到章节答案智慧树2023年山东交通学院
- 省级临床重点专科心血管内科评分标准(试行)
- 大学体育与体质健康(山东联盟)智慧树知到答案章节测试2023年中国石油大学(华东)
- 后进生励志动员会
- 探讨医学工程部门在新医院建设中的任务和作用,医学工程论文
评论
0/150
提交评论