將DCM文件保存成BMP文件或數據流

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瀏覽軟件中的結果一致。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章