2009-10-30 11 views
7

Questa è una domanda molto stretta e specifica, ma so che ci sono qualcun altro là fuori che usa questo, quindi terrò le dita incrociate e spero che qualcuno di voi faccia questa domanda su.Carica l'immagine Dicom e visualizzala - utilizzando la libreria ClearCanvas

Sto lavorando a un'applicazione WPF in cui una parte di esso è un visualizzatore Dicom. Ci piacerebbe utilizzare un componente di terze parti per gestire le cose Dicom, e ClearCanvas è quello che abbiamo avuto la migliore impressione di così lontano. Siamo in grado di caricare un file Dicom e recuperare gli attributi, ma stiamo riscontrando problemi nel mettere i dati dell'immagine nella proprietà Source di un controllo Image per mostrarlo. Qualcuno con suggerimenti su come farlo accadere?

Ecco il codice che uso per estrarre i dati dell'immagine:

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

provato anche utilizzando la libreria ImageViewer, ma è ancora gli stessi dati ..

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

risposta

7

Va bene, ho capito fuori ... Potrebbero esserci altri modi per ottenere questo, ma questo è quello che ho fatto. Ora ho un'immagine Wpf associata a una proprietà che fornisce i dati bitmap. Quanto segue è la proprietà utilizzata per fornire i dati Bitmap.

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

Si noti che questa è una soluzione molto semplice. Uno potrebbe ad es. voglio fare cose come il precaricamento delle foto ecc per evitare un carico pesante quando si scorrono le immagini multiframe. Ma per la domanda "howto display the image" - questo dovrebbe rispondervi ..

+0

stiank81: La prego di elencare il * File .dll che hai aggiunto al tuo progetto per fare le cose. –

+0

Hai provato il livello della finestra della larghezza della finestra per favore, se sì come – AMH

1

Controllare anche Steve, come lui funziona in ClearCanvas. Ho visto la sua risposta (e conferma su questo) nella domanda StackOverflow this.

+0

Grazie! Sì, ho visto anche quella domanda. – stiank81

0

Ok, sono riuscito a mostrare un'immagine DICOM in un Picturebox utilizzando questo codice:

Qui ci sono le assemblee che ho usato:

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; 

ho anche dovuto copiare questi DLL in bin/debug:

BilinearInterpolation.dll (questa l'ho could'nt riferimento come assemblie così ho appena copiato nella cartella bin/degug)

WindowsBase.dll (questa l'ho w come in grado di fare riferimento a esso come un assemblie)

Codice (C'è un pulsante nel mio progetto che consente di selezionare il file di DCM e poi mostrare in un 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(); 
     } 
    } 
Problemi correlati