DCMTK開源庫的學習筆記1:將DCM文件保存成BMP文件或數據流(即數組)
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 codecs
DcmDataset *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瀏覽軟件中的結果一致。