bmp save to dicom

因爲每種圖像的保存格式不同,將其轉換成dicom也是不一樣的,如下是bmp轉換成dicom的主要代碼,主要用dcmtk實現:

#include "dcmtk/dcmimgle/dcmimage.h" 
#include "dcmtk/dcmdata/dcistrmf.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/config/osconfig.h"

#include "dcmtk/dcmdata/dcpixel.h"
#include "dcmtk/dcmdata/dcpixseq.h"
#include "dcmtk/dcmdata/dcpxitem.h"

#include <direct.h>
/*----BMP圖像解析----*/
#include "dcmtk/dcmdata/libi2d/i2dbmps.h"

#include "dcmtk/dcmdata/libi2d/i2doutpl.h"
#include "dcmtk/dcmdata/dcerror.h"

void BmpToDicom(const char* cFileName, const char * dicomName)
{
		OFCondition status;
		DcmFileFormat fileformat;
		DcmDataset* mydatasete = fileformat.getDataset();
		
	
		Uint16 rows, cols, samplePerPixel, bitsAlloc, bitsStored, highBit, pixelRpr, planConf, pixAspectH, pixAspectV;
		OFString photoMetrInt;
		Uint32 length;
	
		E_TransferSyntax ts;
	
	
		OFString filename = OFString(cFileName);
		I2DBmpSource* bmpSource = new I2DBmpSource();
		bmpSource->setImageFile(filename);
		char* pixData = new char[1024 * 1024 * 10];
		
		memset(pixData, 0, sizeof(char) * 1024 * 1024 * 10);
	
		status = bmpSource->readPixelData(rows, cols, samplePerPixel, photoMetrInt, bitsAlloc, bitsStored, highBit, pixelRpr, planConf, pixAspectH, pixAspectV, pixData, length, ts);
	
		if (status.bad()) {
		  std::cout << "read image data failed:" << status.text();
		  return ;
		}
			
		delete bmpSource;
		mydatasete->putAndInsertUint16(DCM_SamplesPerPixel, samplePerPixel);
	
		mydatasete->putAndInsertString(DCM_NumberOfFrames, "1");
	
		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*)pixData,  length);
	
		mydatasete->putAndInsertOFStringArray(DCM_PhotometricInterpretation, photoMetrInt);
	
		status = fileformat.saveFile(dicomName, ts);
	
		if (status.bad())
	
		{
			std::cout << "Error:(" << status.text() << ")\n";
			
		}
}

 

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