DCMTK BMP转多帧影像

BOOL CDcmAssit::MultibmpConvertToDCM(const char * filename , const char * outputfilename )
{
    OFCondition status;

    DcmFileFormat fileformat;
    DcmDataset* mydatasete=fileformat.getDataset();
    DicomUtils::AddDicomElements((DcmDataset*&)mydatasete);
    Uint16 rows,cols,samplePerPixel,bitsAlloc,bitsStored,highBit,pixelRpr,planConf,pixAspectH,pixAspectV;
    OFString photoMetrInt;
    Uint32 length;
    E_TransferSyntax ts;
    char* mydata=new char[1024*1024*10];
    memset(mydata,0,sizeof(char)*1024*1024*10);
    char* tmpData=mydata;

    //拆分文件名
    OFList<OFString> inputFiles;
    if(filename != NULL)
    {
        char * bufFileNames = new char[strlen(filename)+1];
        strcpy_s(bufFileNames,strlen(filename)+1,filename);
        char * p1,*p2;
        p1 = p2= bufFileNames;
        while(1)
        {
            p1 = strchr(p2,'|');
            if(p1 !=NULL)
            {
                *p1='\0';
                inputFiles.push_back(p2);
                p2 = ++p1;
            }
            else
            {
                inputFiles.push_back(p2);
                break;
            }
        }
        delete[] bufFileNames;
    }

    OFListIterator(OFString) if_iter = inputFiles.begin();
    OFListIterator(OFString) if_last = inputFiles.end();
     OFBool ignoreName;
     const char * currentfilename = NULL;
    while (if_iter != if_last)
    {
        ignoreName = OFFalse;
        currentfilename = (*if_iter).c_str();
        if (OFStandard::fileExists(currentfilename))
        {
            OFString offilename = (*if_iter).c_str();
            I2DBmpSource* bmpSource=new I2DBmpSource();
            bmpSource->setImageFile(offilename);
            char *pixData = NULL;
            bmpSource->readPixelData(rows,cols,samplePerPixel,photoMetrInt,bitsAlloc,bitsStored,highBit,pixelRpr,planConf,pixAspectH,pixAspectV,pixData,length,ts);
            memcpy(tmpData,pixData,length);
            tmpData+=length;
            delete bmpSource;

        }
        ++if_iter;
    }


    mydatasete->putAndInsertUint16(DCM_SamplesPerPixel,samplePerPixel);
    mydatasete->putAndInsertString(DCM_NumberOfFrames,"4");
    mydatasete->putAndInsertUint16(DCM_Rows,rows);
    mydatasete->putAndInsertUint16(DCM_Columns,cols);
    mydatasete->putAndInsertUint16(DCM_BitsAllocated,bitsAlloc);
    mydatasete->putAndInsertUint16(DCM_BitsStored,bitsStored);
    mydatasete->putAndInsertUint16(DCM_HighBit,highBit);
    mydatasete->putAndInsertUint8Array(DCM_PixelData,(Uint8*)mydata,4*length);
    mydatasete->putAndInsertOFStringArray(DCM_PhotometricInterpretation,photoMetrInt);
    mydatasete->putAndInsertUint16(DCM_PlanarConfiguration,0);
    status=fileformat.saveFile(outputfilename,ts);
    if(status.bad())
    {
        return FALSE; 
    }
    return TRUE;

}
void DicomUtils::AddDicomElements(DcmDataset*& dataset)  
{  
    //构建测试数据  
  
    /*  添加患者信息  */  
    dataset->putAndInsertUint16(DCM_AccessionNumber,0);  
    dataset->putAndInsertString(DCM_PatientName,"zssure",true);  
    dataset->putAndInsertString(DCM_PatientID,"2234");  
    dataset->putAndInsertString(DCM_PatientBirthDate,"20141221");  
    dataset->putAndInsertString(DCM_PatientSex,"M");  
  
    /*  添加Study信息   */  
    dataset->putAndInsertString(DCM_StudyDate,"20141221");  
    dataset->putAndInsertString(DCM_StudyTime,"195411");  
    char uid[100];  
    dcmGenerateUniqueIdentifier(uid,SITE_STUDY_UID_ROOT);  
    dataset->putAndInsertString(DCM_StudyInstanceUID,uid);  
    dataset->putAndInsertString(DCM_StudyID,"1111");  
  
  
    /*  添加Series信息  */  
    dataset->putAndInsertString(DCM_SeriesDate,"20141221");  
    dataset->putAndInsertString(DCM_SeriesTime,"195411");  
    memset(uid,0,sizeof(char)*100);  
    dcmGenerateUniqueIdentifier(uid,SITE_SERIES_UID_ROOT);  
    dataset->putAndInsertString(DCM_SeriesInstanceUID,uid);  
    /*  添加Image信息   */  
    dataset->putAndInsertString(DCM_ImageType,"ORIGINAL\PRIMARY\AXIAL");  
    dataset->putAndInsertString(DCM_ContentDate,"20141221");  
    dataset->putAndInsertString(DCM_ContentTime,"200700");  
    dataset->putAndInsertString(DCM_InstanceNumber,"1");  
    dataset->putAndInsertString(DCM_SamplesPerPixel,"1");  
    dataset->putAndInsertString(DCM_PhotometricInterpretation,"MONOCHROME2");  
    dataset->putAndInsertString(DCM_PixelSpacing,"0.3\0.3");  
    dataset->putAndInsertString(DCM_BitsAllocated,"16");  
    dataset->putAndInsertString(DCM_BitsStored,"16");  
    dataset->putAndInsertString(DCM_HighBit,"15");  
    dataset->putAndInsertString(DCM_WindowCenter,"600");  
    dataset->putAndInsertString(DCM_WindowWidth,"800");  
    dataset->putAndInsertString(DCM_RescaleIntercept,"0");  
    dataset->putAndInsertString(DCM_RescaleSlope,"1");  
  
  
}  

 

posted @ 2016-02-25 15:48  風行  阅读(763)  评论(0编辑  收藏  举报