Как создать DICOM-изображение из байта (DCMTK)

Я хочу использовать библиотеку DCMTK 3.6.1 в существующем проекте, который может создавать образ DICOM. Я хочу использовать эту библиотеку, потому что я хочу сделать сжатие изображений DICOM. В новом решении (Visual Studio 2013 / C ++) Следуя примеру в официальной документации DCMTK, у меня есть этот код, который работает правильно.

using namespace std;

int main()
{

DJEncoderRegistration::registerCodecs();
DcmFileFormat fileformat;

/**** MONO FILE ******/

if (fileformat.loadFile("Files/test.dcm").good())
{
DcmDataset *dataset = fileformat.getDataset();
DcmItem *metaInfo = fileformat.getMetaInfo();
DJ_RPLossless params; // codec parameters, we use the defaults

// this causes the lossless JPEG version of the dataset
//to be created EXS_JPEGProcess14SV1
dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &params);

// check if everything went well
if (dataset->canWriteXfer(EXS_JPEGProcess14SV1))
{
// force the meta-header UIDs to be re-generated when storing the file
// since the UIDs in the data set may have changed
delete metaInfo->remove(DCM_MediaStorageSOPClassUID);
delete metaInfo->remove(DCM_MediaStorageSOPInstanceUID);

metaInfo->putAndInsertString(DCM_ImplementationVersionName, "New Implementation Version Name");
//delete metaInfo->remove(DCM_ImplementationVersionName);
//dataset->remove(DCM_ImplementationVersionName);

// store in lossless JPEG format
fileformat.saveFile("Files/carrellata_esami_compresso.dcm", EXS_JPEGProcess14SV1);
}
}

DJEncoderRegistration::cleanup();

return 0;
}

Теперь я хочу использовать тот же код в существующем приложении C ++, где

if (infoDicom.arrayImgDicom.GetSize() != 0)  //Things of existing previous code
{

//I have added here the registration
DJEncoderRegistration::registerCodecs(); // register JPEG codecs

DcmFileFormat fileformat;
DcmDataset *dataset = fileformat.getDataset();
DJ_RPLossless params;

dataset->putAndInsertUint16(DCM_Rows, infoDicom.rows);
dataset->putAndInsertUint16(DCM_Columns, infoDicom.columns,);
dataset->putAndInsertUint16(DCM_BitsStored, infoDicom.m_bitstor);
dataset->putAndInsertUint16(DCM_HighBit, infoDicom.highbit);
dataset->putAndInsertUint16(DCM_PixelRepresentation, infoDicom.pixelrapresentation);
dataset->putAndInsertUint16(DCM_RescaleIntercept, infoDicom.rescaleintercept);
dataset->putAndInsertString(DCM_PhotometricInterpretation,"MONOCHROME2");
dataset->putAndInsertString(DCM_PixelSpacing, "0.086\\0.086");
dataset->putAndInsertString(DCM_ImagerPixelSpacing, "0.096\\0.096");
BYTE* pData = new BYTE[sizeBuffer];

LPBYTE   pSorg;

for (int nf=0; nf<iNumberFrames; nf++)
{
//this contains all the PixelData and I put it into the dataset
pSorg = (BYTE*)infoDicom.arrayImgDicom.GetAt(nf);
dataset->putAndInsertUint8Array(DCM_PixelData, pSorg, sizeBuffer);

dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &params);
//and I put it in my data set//but this IF return false so che canWriteXfer fails...
if (dataset->canWriteXfer(EXS_JPEGProcess14SV1))
{
dataset->remove(DCM_MediaStorageSOPClassUID);
dataset->remove(DCM_MediaStorageSOPInstanceUID);
}

//the saveFile fails too, and the error is "Pixel
//rappresentation  non found" but I have set the Pixel rep with
//dataset->putAndInsertUint16(DCM_PixelRepresentation, infoDicom.pixelrapresentation);

OFCondition status = fileformat.saveFile("test1.dcm", EXS_JPEGProcess14SV1);

DJEncoderRegistration::cleanup();

if (status.bad())
{
int error = 0; //only for test
}

thefile.Write(pSorg, sizeBuffer); //previous code
}

На самом деле я сделал тест с изображением на одном кадре, поэтому цикл for выполняется только один раз. Я не понимаю почему, если я выберу dataset->chooseRepresentation(EXS_LittleEndianImplicit, &params); или же dataset->chooseRepresentation(EXS_LittleEndianEXplicit, &params); работает отлично но не когда выбираю dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &params);

Если я использую то же изображение в первом приложении, я могу сжать изображение без проблем …

РЕДАКТИРОВАТЬ: Я думаю, что главная проблема, которую нужно решить, это status = dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &rp_lossless) это возвращение «тег не найден». Как я могу узнать, какой тег пропущен?

EDIT2: Как подсказывает на форуме DCMTK, я добавил тег о выделенных битах и ​​теперь работает для нескольких изображений, но не для всех. Для некоторых изображений у меня снова есть «Тег не найден»: как узнать, какой из тегов отсутствует? Как правило, лучше вставить все теги?

0

Решение

Я решаю проблему с добавлением тегов DCM_BitsAllocated и DCM_PlanarConfiguration. Это теги, которые пропущены. Я надеюсь, что это будет полезно для кого-то.

2

Другие решения

По крайней мере, вы должны вызвать функцию chooseRepresentation после того, как вы применили данные.

**dataset->putAndInsertUint8Array(DCM_PixelData, pSorg, sizeBuffer);**
dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &params);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector