I am working on a C# project and I have to create a single Dicom file from multiple images. And I use the fo-dicom lib (https://github.com/fo-dicom/fo-dicom).
But the thing is that when I want to view the dicom file using Dicom viewers I get an error.
public static DicomDataset CreateMultiFrameDataset(int columns, int rows, int numFrames, IEnumerable<byte[]> images)
{
var dataset = new DicomDataset(DicomTransferSyntax.JPEGProcess1);
dataset.Add(DicomTag.Columns, (ushort)columns);
dataset.Add(DicomTag.Rows, (ushort)rows);
dataset.Add(DicomTag.BitsAllocated, (ushort)8);
dataset.Add(DicomTag.LossyImageCompression, "01");
dataset.Add(DicomTag.StudyTime, "135731");
dataset.Add(DicomTag.StudyDate, "19930325");
dataset.Add(DicomTag.Modality, "XB");
dataset.Add(DicomTag.SeriesNumber, "1");
dataset.Add(DicomTag.StudyInstanceUID, "1000");
dataset.Add(DicomTag.SeriesInstanceUID, "1000");
dataset.Add(DicomTag.PatientName, "John");
dataset.Add(DicomTag.LossyImageCompressionMethod, "ISO_10918_1");
dataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.YbrFull422.Value);
dataset.Add(DicomTag.SOPClassUID, DicomUID.MultiFrameTrueColorSecondaryCaptureImageStorage);
dataset.Add(DicomTag.SOPInstanceUID, "1");
dataset.Add(DicomTag.MediaStorageSOPInstanceUID, "1");
dataset.Add(DicomTag.NumberOfFrames, numFrames.ToString());
dataset.Add(DicomTag.FrameIncrementPointer, "");
dataset.Add(DicomTag.StudyDescription, "TESTTEST");
dataset.Add(DicomTag.RadiationSetting, "GR");
dataset.AddOrUpdate(DicomTag.HighBit, (ushort)7);
dataset.AddOrUpdate(DicomTag.BitsStored, (ushort)8);
dataset.AddOrUpdate(DicomTag.SamplesPerPixel, (ushort)7);
dataset.AddOrUpdate(DicomTag.PixelRepresentation, (ushort)7);
dataset.AddOrUpdate(DicomTag.PlanarConfiguration, (ushort)7);
var pixelData = DicomPixelData.Create(dataset, true);
pixelData.BitsStored = 8;
pixelData.SamplesPerPixel = 3;
pixelData.HighBit = 7;
pixelData.PixelRepresentation = PixelRepresentation.Unsigned;
pixelData.PlanarConfiguration = PlanarConfiguration.Interleaved;
int nb = 1;
foreach (var image in images)
{
dataset.AddOrUpdate(DicomTag.SOPInstanceUID, nb.ToString());
dataset.AddOrUpdate(DicomTag.MediaStorageSOPInstanceUID, nb.ToString());
nb++;
var fragment = new DicomOtherByteFragment(DicomTag.PixelData);
fragment.Fragments.Add(EvenLengthBuffer.Create(new MemoryByteBuffer(image)));
pixelData.AddFrame(new CompositeByteBuffer(fragment));
}
return dataset;
}
Here is the code that I tried