因爲每種圖像的保存格式不同,將其轉換成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";
}
}