【发布时间】:2021-07-19 12:36:12
【问题描述】:
我是 DICOM 和 DCMTK 的新手。我有一组 BITMAP 超声数据,我想将其保存为无损 DICOM 文件。
在将数据加载到队列frame_queue 并为超声多帧图像设置所有必需的 DICOM 必要参数后,我实现了一个循环以将图像添加到 DcmDataset 中,如下所示:
std::unique_ptr<DcmDataset> dataset;
/***
DICOM parameters A setted not added here as many parameters are set
***/
std::shared_ptr<unsigned char[]> frame;
std::shared_ptr<RGBQUAD[]> colorTable;
DJEncoderRegistration::registerCodecs();
DJ_RPLossless params; // codec parameters, we use the defaults
// this causes the lossless JPEG version of the m_dataset to be created
/**/
E_TransferSyntax xfer = DcmXfer(EXS_JPEGProcess14).getXfer();
DcmPixelSequence* sequence = new DcmPixelSequence(DcmTag(DCM_PixelData, EVR_OB));
DcmPixelData* newPixelData = new DcmPixelData(DCM_PixelData);
dataset->insert(sequence, OFTrue);
OFstatic_cast(DcmPixelData*, newPixelData)->putOriginalRepresentation(xfer, NULL, sequence);
while (frame_queue.popFrame(frame, colorTable)) // we extract a new frame from the queue
{
DcmPixelItem* newItem = new DcmPixelItem(DcmTag(DCM_Item, EVR_OB));
if (newItem != NULL)
{
sequence->insert(newItem);
/* put pixel data into the item */
std::shared_ptr<Uint8[]> newDCMFrame;
colorTableToRGB(frame, colorTable, newDCMFrame, m_frameWidth, m_frameHeight);
result = newItem->putUint8Array((Uint8*)newDCMFrame.get(), m_frameHeight * m_frameWidth * 3).good(); // this returns true in my test
frame.reset();
colorTable.reset();
}
}
dataset->chooseRepresentation(EXS_JPEGProcess14, ¶ms);
dataset->saveFile(path.c_str());
dataset->chooseRepresentation(EXS_JPEGProcess14, &params); 的调用引发错误:
DcmDataset: Wrong class for pixel data element, cannot change representation
DICOM 文件已保存,但为空。
有谁知道是什么导致了这个错误?
【问题讨论】: