wpfimagedicomclearcanvas

Load Dicom image and display it - using ClearCanvas library


This is a very narrow and specific question, but I know there are someone else out there using this, so I'll keep my fingers crossed and hope anyone of you pics this question up.

I'm working on a WPF application where one part of it is a Dicom viewer. We'd like to use a 3rd party component to handle the Dicom stuff, and ClearCanvas is the one we've got the best impression of this far. We're able to load a Dicom file and fetch the attributes, but we're having problems putting the image data on the Source property of an Image control to show it. Anyone with hints on how to make this happen?

Here's the code I use for extracting the image data:

var file = new DicomFile(dicomFilePath);
var patientName = file.DataSet.GetAttribute(DicomTags.PatientsName);
var imageData = file.DataSet.GetAttribute(DicomTags.PixelData);

Have also tried using the ImageViewer library, but it is still the same data..

var localSopDataSource = new LocalSopDataSource(new DicomFile(dicomFilePath));
var patientName = localSopDataSource.File.DataSet.GetAttribute(DicomTags.PatientsName);
var imageData = localSopDataSource.File.DataSet.GetAttribute(DicomTags.PixelData);

Solution

  • Okay, I figured it out.. There might be some more ways of achieving this, but this is what I did. Now I have a Wpf Image bound to a property which provides the bitmap data. The following is the property used to provide the Bitmap data.

    public BitmapSource CurrentFrameData
    {
        get
        {
            LocalSopDataSource _dicomDataSource = 
                new LocalSopDataSource(_dicomFilePath);
            var imageSop = new ImageSop(_dicomDataSource);
    
            IPresentationImage presentationImage = 
                PresentationImageFactory.Create(imageSop.Frames[CurrentFrame]);
    
            int width = imageSop.Frames[CurrentFrame].Columns;
            int height = imageSop.Frames[CurrentFrame].Rows;
    
            Bitmap bmp = presentationImage.DrawToBitmap(width, height);
            BitmapSource output = Imaging.CreateBitmapSourceFromHBitmap(
              bmp.GetHbitmap(),
              IntPtr.Zero,
              Int32Rect.Empty,
              BitmapSizeOptions.FromWidthAndHeight(width, height));
    
              return output;
        }
    }
    

    Note that this is a very straight forward solution. One might e.g. want to do stuff like preloading the pictures etc to avoid heavy load when scrolling multiframe images. But for the "howto display the image" question - this should answer it..