Загрузите изображение Dicom и отобразите его - используя библиотеку ClearCanvas - PullRequest
7 голосов
/ 30 октября 2009

Это очень узкий и конкретный вопрос, но я знаю, что кто-то еще использует его, поэтому я буду скрещивать пальцы и надеюсь, что кто-нибудь из вас придумает этот вопрос.

Я работаю над приложением WPF, одной частью которого является средство просмотра Dicom. Мы бы хотели использовать сторонний компонент для работы с Dicom, и именно ClearCanvas мы получили лучшее впечатление от этого. Мы можем загрузить файл Dicom и получить атрибуты, но у нас возникают проблемы с размещением данных изображения в свойстве Source элемента управления Image для его отображения. Кто-нибудь с подсказками, как это сделать?

Вот код, который я использую для извлечения данных изображения:

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

Также пытались использовать библиотеку ImageViewer, но это все те же данные ..

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

Ответы [ 3 ]

7 голосов
/ 08 ноября 2009

Хорошо, я понял это. Может быть, есть еще несколько способов добиться этого, но это то, что я сделал. Теперь у меня есть Wpf-изображение, привязанное к свойству, которое предоставляет растровые данные. Ниже приводится свойство, используемое для предоставления растровых данных.

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;
    }
}

Обратите внимание, что это очень прямолинейное решение. Можно, например, хочу делать такие вещи, как предварительная загрузка изображений и т. д., чтобы избежать большой нагрузки при прокрутке многокадровых изображений Но на вопрос «как отобразить изображение» - на это следует ответить ..

1 голос
/ 10 ноября 2009

Также проверьте Стив , поскольку он работает в ClearCanvas. Я видел его ответ (и подтверждение об этом) в этом вопросе StackOverflow.

0 голосов
/ 14 июля 2013

Хорошо, мне удалось показать изображение DICOM в Picturebox, используя этот код:

Вот сборки, которые я использовал:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ClearCanvas.Common;
using ClearCanvas.Dicom;
using System.Windows.Media.Imaging;
using ClearCanvas.ImageViewer;
using ClearCanvas.ImageViewer.StudyManagement;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows;
using System.IO;

Мне также пришлось скопировать эти dll в bin / debug:

BilinearInterpolation.dll (на этот раз я не могу ссылаться на него как на сборку, поэтому я просто скопировал его в папку bin / degug)

WindowsBase.dll (этот файл мне удалось отнести к сборке)

Код (в моем проекте есть кнопка, которая позволяет вам выбрать файл dcm, а затем показать его в окне для картинок)

Private void button2_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "DICOM Files(*.*)|*.*";
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            if (ofd.FileName.Length > 0)
            {

                var imagen = new DicomFile(ofd.FileName); 

                LocalSopDataSource DatosImagen = new LocalSopDataSource(ofd.FileName); 

        ImageSop imageSop = new ImageSop(DatosImagen);

        IPresentationImage imagen_a_mostrar = PresentationImageFactory.Create(imageSop.Frames[1]); 

        int width = imageSop.Frames[1].Columns; 

        int height = imageSop.Frames[1].Rows; 

        Bitmap bmp = imagen_a_mostrar.DrawToBitmap(width, height); 

        PictureBox1.Image = bmp; 



            imageOpened = true;

            }
            ofd.Dispose();
        }
    }
...