【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)
轉自:https://blog.csdn.net/zssureqh/article/details/8784980
DCMTK開源庫介紹:
? ? ? ? DCMTK是目前最全面實現DICOM3.0標準的開源庫,通過結合DCMTK開源庫和CxImage圖像開源庫,能夠很方便的開發屬于自己的DCM文件編輯瀏覽軟件。
DCMTK與CxImage的結合:
? ? ? ? 下面記錄”DCM文件到BMP文件格式的轉換“的學習和探索的過程。
? ? ? ? ?1)BMP文件的格式這里不細講(可自行參閱MSDN相關資料)。BMP屬于設備無關圖(DIB),內存中只要依次包含BMP文件頭(BITMAPFILEHEADER)、BMP信息頭(BITMAPINFOHEADER)、調色板(Palette),以及真實像素信息,就可以在所有顯示設備中進行顯示。因此將DCM文件轉換到BMP格式的主要工作是:從DCM眾多數據元中挑選出BMP文件頭、信息頭所必須的信息(如圖像寬度、圖像高度、每個像素所占的空間、像素數據等)。
? ? ? ? ?2)此次采用了dcmtk中的dcmimgle開發包,利用DicomImage類提供的createWindowsDIB接口以及writeBMP來進行格式轉化。具體代碼如下:
?
DcmFileFormat *mImage=new DcmFileFormat();DJDecoderRegistration::registerCodecs(); // register JPEG codecsDcmDataset *dataset = mImage->getDataset();E_TransferSyntax xfer=dataset->getOriginalXfer();dataset->chooseRepresentation(EXS_LittleEndianExplicit,NULL);DicomImage *pdcmImage=new DicomImage((DcmFileFormat*)mImage,EXS_LittleEndianExplicit,CIF_AcrNemaCompatibility,0,1);if(pdcmImage->getStatus()!=EIS_Normal)exit(0);void* pDIB=NULL;int size=0;pdcmImage->createWindowsDIB(pDIB,size,0,8,1,1);? ? ? ? 至此,pDIB內存中就獲得了”c:\test.dcm“文件像素數據多對應的BMP格式的數據。如果想將pDIB保存成BMP文件,還需要補充BMP文件頭(BITMAPFILEHEADER)、BMP信息頭(BITMAPINFOHEADER)、調色板(Palette)。參照MSDN中BITMAPFILEHEADER和BITMAPINFOHEADER的結構,逐個成員賦值即可。假設我們生成的文件頭變量為mBmpFileHeader,信息頭變量為mBmpInfoHeader。由于createWindowsDIB函數中的BMP像素位數設定的是8,所以BMP圖像屬于索引圖像,其文件中需要調色板,調色板的生成如下所示(最簡單的生成方法):
?
RGBQUAD* mPalette=new RGBQUAD[256];memset(mPalette,0,sizeof(RGBQUAD)*256);for(int i=0;i<256;++i){mPalette[i].rgbBlue=i;mPalette[i].rgbGreen=i;mPalette[i].rgbRed=i;}? ? ? ? 隨后將mBmpFileHeader、mBmpInfoHeader、mPalette添加到pDIB的前面,就構成了一幅BMP圖像,直接將此數據保存成bmp文件即可。具體的鏈接步驟如下:
<span style="white-space:pre"> </span>int imgsize=width*height;int headsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;int size=headsize+imgsize;BYTE* mDibImage=new BYTE[size];memset(mDibImage,0,size);memcpy(mDibImage,mBmpFileHeader,sizeof(BITMAPFILEHEADER));memcpy(&mDibImage[sizeof(BITMAPFILEHEADER)],mBmpInfoHeader,sizeof(BITMAPINFOHEADER));memcpy(&mDibImage[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)],mPalette,sizeof(RGBQUAD)*256);memcpy(&mDibImage[headsize],pDIB,imgsize);? ? ? ?至此mDibImage內存存儲的數據就是一幅完整的BMP文件。將其保存后的結果如下圖(左)所示:
?
?
?
? ? ? ?相比dcm瀏覽軟件中看到的結果(上圖右),自己生成的圖像模糊很多。思考原因,可能是窗寬窗位的關系。DicomImage中也提供了調整窗寬窗位的接口setWindow。在調用createWindowsDIB函數之前,調用setW函數,隨后生成的BMP圖像結果如下:
?
?
與常用的dcm瀏覽軟件中的結果一致。
源代碼下載:
? ? ? ? ?鑒于有些網友向我詢問完整源碼的問題,以前都是直接郵箱發送的,最近嫌麻煩,就將完整的.h和.cpp文件上傳到了CSDN中,資源鏈接是:http://download.csdn.net/detail/zssureqh/7860671,需要2個積分奧。哈哈,如果不是CSDN的朋友,或者沒有積分的朋友也不要著急,也可以到我的Github主頁進行免費下載,地址是:https://github.com/zssure-thu/DcmtkAndCxImage,有問題及時反饋,多多交流,共同進步。
?
作者:zssure@163.com
時間:2014-09-03(最后更新時間)
總結
以上是生活随笔為你收集整理的【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刘德华新片《将进酒》即将开拍 多位影帝同
- 下一篇: 【转】VTK与Qt整合的示例