Я хочу использовать библиотеку 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, ¶ms);
// 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, ¶ms);
//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, ¶ms);
или же dataset->chooseRepresentation(EXS_LittleEndianEXplicit, ¶ms);
работает отлично но не когда выбираю dataset->chooseRepresentation(EXS_JPEGProcess14SV1, ¶ms);
Если я использую то же изображение в первом приложении, я могу сжать изображение без проблем …
РЕДАКТИРОВАТЬ: Я думаю, что главная проблема, которую нужно решить, это status = dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &rp_lossless)
это возвращение «тег не найден». Как я могу узнать, какой тег пропущен?
EDIT2: Как подсказывает на форуме DCMTK, я добавил тег о выделенных битах и теперь работает для нескольких изображений, но не для всех. Для некоторых изображений у меня снова есть «Тег не найден»: как узнать, какой из тегов отсутствует? Как правило, лучше вставить все теги?
Я решаю проблему с добавлением тегов DCM_BitsAllocated и DCM_PlanarConfiguration. Это теги, которые пропущены. Я надеюсь, что это будет полезно для кого-то.
По крайней мере, вы должны вызвать функцию chooseRepresentation после того, как вы применили данные.
**dataset->putAndInsertUint8Array(DCM_PixelData, pSorg, sizeBuffer);**
dataset->chooseRepresentation(EXS_JPEGProcess14SV1, ¶ms);