2009-10-30 25 views
7

To jest bardzo wąskie i konkretne pytanie, ale wiem, że jest ktoś inny, który używa tego, więc trzymam kciuki i mam nadzieję, że ktokolwiek z was wyświetli to pytanie w górę.Załaduj obraz Dicom i wyświetl go - przy użyciu biblioteki ClearCanvas.

Pracuję nad aplikacją WPF, której jedną częścią jest przeglądarka Dicom. Chcielibyśmy użyć komponentu innego producenta do obsługi Dicom, a ClearCanvas jest tym, z którego mamy najlepsze wrażenie. Możemy załadować plik Dicom i pobrać atrybuty, ale mamy problemy z umieszczeniem danych obrazu we właściwości Źródło elementu sterującego Obraz, aby go wyświetlić. Ktoś z podpowiedziami, jak to zrobić?

Oto kod używam do wydobywania danych obrazu:

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

Próbowałem również z wykorzystaniem biblioteki ImageViewer, ale to wciąż te same dane ..

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

Odpowiedz

7

Ok, pomyślałem To może być kilka sposobów na osiągnięcie tego, ale to właśnie zrobiłem. Teraz mam obraz Wpf związany z właściwością, która dostarcza danych bitmapowych. Poniżej znajduje się właściwość używana do dostarczania danych bitmapowych.

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

Należy zauważyć, że jest to bardzo proste rozwiązanie. Ktoś mógłby np. chcesz robić rzeczy takie jak wstępne ładowanie zdjęć itp., aby uniknąć dużego obciążenia podczas przewijania obrazów wieloramkowych. Ale pytanie "howto display the image" - to powinno odpowiedzieć ..

+0

stiank81: Czy mógłbyś podać wykaz * Pliki .dll dodane do projektu, aby zrobić to. –

+0

Czy wypróbowałeś okno o szerokości okna proszę, jeśli tak, to – AMH

1

Sprawdź również Steve, ponieważ on działa w ClearCanvas. Widziałem jego odpowiedź (i potwierdzenie tego) w pytaniu StackOverflow o numerze this.

+0

Dzięki! Tak - widziałem też to pytanie. – stiank81

0

Ok, udało mi się pokazać obraz DICOM w PictureBox przy użyciu tego kodu:

Oto zespoły użyłem:

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; 

miałem też skopiować te dll do bin/debug:

BilinearInterpolation.dll (ten could'nt odwołać go jako assemblie więc po prostu skopiowane do folderu bin/degug)

WindowsBase.dll (ten ja w jak w stanie odwołać go jako assemblie)

kod (Jest to przycisk w moim projekcie, który pozwala wybrać plik DCM, a następnie pokazać je w PictureBox)

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