【发布时间】:2017-09-22 15:16:30
【问题描述】:
我有自己的图像编码器和解码器。我想要的是读取 DICOM 图像,提取未压缩的图像像素,使用我的编码器对其进行压缩,然后将这些压缩的像素写回到 DICOM 文件中以代替未压缩的像素。解码器会做相反的事情。这可以在 Imebra 中进行吗?我可以读取标签和像素,但是在压缩它们之后,我不确定如何将它们放回去(它们当前位于 char* 缓冲区中),或者这是否可能。我在 C++ 中使用 Imebra。
或者,我可以创建全新的 DICOM 文件,但在这种情况下,我需要轻松地从旧文件中传输所有 DICOM 标签。
如果这在 Imebra 中是不可能的,是否有其他 C++ 库允许这样做?
编辑: 谢谢你的回答,保罗。但是,原始 DICOM 图像仍然保持不变(使用第二个选项)。你能说我在这里做错了什么吗?
std::unique_ptr<imebra::DataSet> loadedDataSet(imebra::CodecFactory::load(imgNameM));
imebra::WritingDataHandlerNumeric* dataHandler = loadedDataSet->getWritingDataHandlerRaw(imebra::TagId(imebra::tagId_t::PixelData_7FE0_0010), 0);
dataHandler->assign(buffer, size);
delete dataHandler;
loadedDataSet 不为空,我用 bufferExists 检查过。
编辑 2: 是的,我没有保存。现在我添加了该行并设法修改解决了我原来的问题的 PixelData 元素。谢谢。但是,文件的其他一些部分现在也会自动更改。在文件的开头添加了 100 多个空字节,尽管这并没有给我带来太多困扰。困扰我的是,现在添加了 (0008,0005) 特定字符集标记,并且未设置其值(它为空),然后在尝试读取该修改文件的标记时导致 CharsetConversionNoTableError 。如果我手动删除该标签并修复组长度,我可以正常读取标签。有没有可能避免这种行为?
【问题讨论】:
-
您保存文件了吗? imebra::CodecFactory::save(*loadedDataSet, "test.dcm", imebra::codecType_d::dicom)。请注意,更改图像原始数据可能需要更改其他标签才能正确解释,包括 DataSet 的传输语法
-
@Paolo Brandoli 是的,跳过了。我添加了它,现在可以修改 PixelData。