Как сохранить сжатые пиксели (сжатые с помощью моего собственного кодировщика) обратно в файл изображения DICOM с помощью библиотеки Imebra?

У меня есть свой собственный кодер и декодер изображений. Я хочу читать изображения DICOM, извлекать пиксели несжатого изображения, сжимать их с помощью моего кодера, а затем записывать эти сжатые пиксели обратно в файл DICOM вместо несжатых пикселей. Декодер сделал бы обратное. Это возможно сделать в Imebra? Я могу читать теги и пиксели, но после их сжатия я не уверен, как вернуть их обратно (они в настоящее время находятся в буфере char *), или если это вообще возможно. Я использую Imebra в C ++.

Кроме того, было бы хорошо, если бы я мог создать совершенно новый файл 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;

Загруженный DataSet не пуст, я проверил с помощью bufferExists.

Изменить 2:
Да, я не сохранил это. Теперь я добавил эту строку и сумел изменить элемент PixelData, который решил мою первоначальную проблему. Благодарю. Однако некоторые другие части файла теперь также автоматически изменяются. В начале файла добавлено более 100 пустых байтов, хотя это меня не сильно беспокоит. Что меня беспокоит, так это то, что (0008 0005) тег «Определенный набор символов» теперь добавлен, а его значение не установлено (оно пустое), что затем вызывает CharsetConversionNoTableError при попытке прочитать теги этого измененного файла. Если я удаляю этот тег вручную и фиксирую длину группы, я могу читать теги нормально. Есть ли возможность избежать такого поведения?

1

Решение

Imebra уже предоставляет кодер / декодер для JPEG без потерь, базовой линии и расширенного JPEG, RLE.

Есть несколько способов добавить свой собственный кодек в Imebra:

  • наследовать класс от imebra :: creation :: codecs :: imageCodec
  • или закодируйте изображение в буфер символов, затем добавьте его в виде необработанного содержимого, используя imebra :: DataSet :: getWritingDataHandlerRaw который позволяет писать тег необработанного контента. getWritingDataHandlerRaw возвращает WritingDataHandlerNumeric. использование WritingDataHandlerNumeric :: правопреемник чтобы переместить байтовый буфер в обработчик данных, затем удалите обработчик данных, чтобы он зафиксировал свое содержимое в наборе данных.
  • В примере changeTransferSyntax, поставляемом с библиотекой, показано, как создать новый набор данных со всеми теми же тегами из исходного набора данных, но с другим синтаксисом передачи (включая другое сжатие изображений).
1

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

Других решений пока нет …

По вопросам рекламы [email protected]