网站开发公司怎么能接到单子,dw课设做网站,怎么做网站和服务器吗,wordpress占用大转自#xff1a;https://blog.csdn.net/zssureqh/article/details/8804736
dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中#xff0c;学习了读取dcm文件的相关信息#xff0c;如信息头MetaInformation元素、像素数据元素#xff0c;只停留在了读…转自https://blog.csdn.net/zssureqh/article/details/8804736
dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中学习了读取dcm文件的相关信息如信息头MetaInformation元素、像素数据元素只停留在了读取和显示dcm文件的阶段随着学习的深入自己开发的平台的功能逐渐增加“修改dcm文件的相关数据元”在所难免。下面将简单的介绍一下对dcm文件的修改主要的参考资料是dcmtk开源库的官方文件另外也很感谢diqiucun666在CSDN的博文http://blog.csdn.net/diqiucun666/article/details/2866908里面详细介绍了dcmtk的主要构成是dcmtk开源库很好的中文是说明手册。
参照博文中的
dcmtk开源库中对dcm文件定义的最顶层的类是DcmFileFormat每次需要利用DcmFileFormat的对象来进行dcm文件的导入loadFile和导出saveFile。dcm文件其本质与常见的DIB文件格式相似可总体分为“文件头”和“文件体”两部分。dcmtk开源库分别为“文件头”和“文件体“封装了相应的类DcmMetaInfo和DcmDataset。两个类都继承自DcmItem类其含有主要的成员变量为elementList一个存储相应dcm文件数据元的双向列表。注意DcmFileFormat类继承自DcmSequenceOfItems类其含有的数据成员变量时itemList即含有DcmMetaInfo类和DcmDataset类的基类的双向列表——这说明了dcm文件的数据元可以进行嵌套存储DcmFileFormat变量的成员参见下图 此处是一个空的DcmFileFormat类的对象mDcmFileFormat其itemList双向链表中只有两个item成员firstNode就是DcmMetaInfo类的实例lastNode就是DcmDataset类的实例。
那么找到修改itemList数据成员的方法就能够修改相应的dcm数据元达到自由修改dcm文件的目的但是在修改的时候需要注意各个数据元的元素类型的匹配。
查看dcitem.h文件可以发现dcmtk给我们定义了几种操作itemList双向链表的方法如下图 下面给出修改dcm文件中的患者姓名和dcm像素数据的代码 DcmFileFormat mDcmImage;mDcmImage.loadFile(c:\\test.dcm);short* pPixelDatastatic_castshort*(mDcmImage.getPixelData());int sizemDcmImage.getWidth()*mDcmImage.getHeight();for(int i0;isize;i)if(pPixelData[i]800)pPixelData[i]0;elsepPixelData[i]2000;UINT16 *pDatanew UINT16[size];memcpy(pData,pPixelData,size*sizeof(UINT16));DcmDataset *datasetmDcmImage.getDataset();DcmMetaInfo *metainfomDcmImage.getMetaInfo();metainfo-remove(DCM_TransferSyntaxUID);delete dataset-remove(DCM_PatientName);dataset-putAndInsertString(DCM_PatientName,TEST-THU);delete dataset-remove(DCM_PixelData);dataset-putAndInsertUint16Array(DCM_PixelData,pData,size);mDcmImage.saveFile(c:\\self.dcm,EXS_LittleEndianExplicit);
其中getPixelData()函数是对 DcmDataset *dataset this-getDataset();// decompress data set if compresseddataset-chooseRepresentation(EXS_LittleEndianExplicit, NULL);DcmElement* elementNULL;dataset-findAndGetElement(DCM_PixelData,element);unsigned char* pImageNULL;element-getUint8Array(pImage);return pImage; 代码的封装。利用像素指针dcm文件的像素数据进行二值化。
然后我们利用DcmItem类中定义的putAndInsertString修改DCM_PatinetName标签即患者的姓名。
对别结果如下