More often than not, DICOM files are loaded from a location on disk due to the size and complexity of the files. However, no environment and scenario is the same and we periodically get requests regarding how to load DICOM files from memory, more specifically a byte[]
rather than a Stream
. Due to the way that .NET garbage collection works we must use a .NET GCHandle
object when passing an IntPtr
to the overloaded DicomDataSet.Load
function.
private byte[] loadedFile; // byte array for DICOM file from database, server, etc.
private DicomDataSet dicomDS;
private DicomElement element;
// Pin object so it is not garbage collected before work is done.
GCHandle gch = GCHandle.Alloc(loadedFile);
// Load DicomDS from byte[] using IntPtr of array.
dicomDS.Load(Marshal.UnsafeAddrOfPinnedArrayElement(loadedFile, 0),
loadedFile.Length, DicomDataSetFlags.None);
// Unpin object.
gch.Free();
// Get image from DicomDS.
element = dicomDS.FindFirstElement(null, DicomTag.PixelData, true);
rasterImageViewer1.Image = dicomDS.GetImage(element, 0, 0,
Leadtools.RasterByteOrder.Gray, DicomGetImageFlags.None);
To download the entire C# example project for versions 17.5 and 18, check out this forum post.