(fo-dicom) Как я могу изменить и сохранить файл DICOM в новый каталог?
Я хочу изменить заголовок DICOM и установить два тега. Это работает, но затем, когда я хочу сохранить его в новом файле, я получаю следующее исключение:
NullReferenceException: Object reference not set to an instance of an object
Dicom.Network.NetworkManager.get_MachineName ()
Dicom.DicomFileMetaInformation.CreateSourceApplicationEntityTitle ()
Dicom.DicomFileMetaInformation..ctor (Dicom.DicomFileMetaInformation metaInfo)
Dicom.DicomFile.PreprocessFileMetaInformation ()
Dicom.DicomFile.Save (System.String fileName,
Dicom.IO.Writer.DicomWriteOptions options)
DICOMConverter.addMaxMin () (at Assets/Scripts/DICOMConverter.cs:67)
Мой код DICOMConverter.addMaxMin() является:
var dicomFile = DicomFile.Open(DICOMFilePath);
var dicomImage = new DicomImage(dicomFile.Dataset);
var header = DicomPixelData.Create(dicomImage.Dataset);
var pixelData = PixelDataFactory.Create(header, 0);
for (int x = 0; x < Convert.ToInt32(dicomFile.Dataset.Get<string>(DicomTag.Columns)); x++)
{
for (int y = 0; y < Convert.ToInt32(dicomFile.Dataset.Get<string>(DicomTag.Rows)); y++)
{
if (pixelData.GetPixel(x, y) < minValue)
minValue = pixelData.GetPixel(x, y);
if (pixelData.GetPixel(x, y) > maxValue)
maxValue = pixelData.GetPixel(x, y);
}
}
dicomFile.Dataset.AddOrUpdate(DicomTag.LargestImagePixelValue, Convert.ToString(maxValue));
dicomFile.Dataset.AddOrUpdate(DicomTag.SmallestImagePixelValue, Convert.ToString(minValue));
dicomFile.Save(@"newDicom");
Выдает исключение всегда, когда я пытаюсь использовать метод Save().
Я использовал для этого пример операции с файлом из https://github.com/fo-dicom/fo-dicom, но он не работает должным образом.
У кого-нибудь есть идея для лучшего решения для сохранения или я могу объяснить, что мне не хватает?
1 ответ
Это исключение происходит, потому что по какой-то причине ваше приложение не имеет правильно настроенной реализации NetworkManager для конкретной платформы. Это происходит в статическом конструкторе класса NetworkManager. Но вы можете установить его вручную в любое время с помощью NetworkManager.SetImplementation(..). Без дополнительной информации трудно сказать, почему не инициализирован экземпляр, но в следующем выпуске fo-dicom будет другое решение:
При записи файла на диск fo-dicom устанавливает SourceApplicationEntityTile (0002,0016) и, следовательно, пытается получить доступ к NetworkManager.LocalMachineName. Этот запрос извлечения хочет повторно использовать SourceApplicationEntityTitle, если файл не был создан заново, но клонирован из другого файла и, следовательно, уже имеет SourceApplicationEntityTitle. Это решит вашу проблему. Внимательно посмотрите на https://github.com/fo-dicom/fo-dicom/pull/615