2009-10-30 12 views
7

Ceci est une question très étroite et spécifique, mais je sais qu'il y a quelqu'un d'autre là-bas en utilisant cela, donc je croiserai les doigts et j'espère que vous poserez cette question en hautCharger l'image Dicom et l'afficher - en utilisant la bibliothèque ClearCanvas

Je travaille sur une application WPF dont une partie est une visionneuse Dicom. Nous aimerions utiliser un composant tiers pour gérer les trucs de Dicom, et ClearCanvas est celui dont nous avons la meilleure impression jusqu'ici. Nous sommes en mesure de charger un fichier Dicom et d'extraire les attributs, mais nous avons des problèmes pour mettre les données d'image sur la propriété Source d'un contrôle Image pour l'afficher. Quelqu'un avec des conseils sur la façon de rendre cela possible?

Voici le code que j'utilise pour extraire les données d'image:

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

ont également essayé d'utiliser la bibliothèque ImageViewer, mais ce sont toujours les mêmes données ..

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

Répondre

7

D'accord, je me suis dit Il y a peut-être d'autres façons d'y parvenir, mais c'est ce que j'ai fait. Maintenant, j'ai une image Wpf liée à une propriété qui fournit les données bitmap. Voici la propriété utilisée pour fournir les données 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; 
    } 
} 

Notez qu'il s'agit d'une solution très simple. On pourrait, par exemple, voulez faire des choses comme le préchargement des images etc pour éviter une charge importante lors du défilement des images de multitrames. Mais pour la "howto afficher l'image" question - cela devrait y répondre ..

+0

stiank81: Pourriez-vous s'il vous plaît énumérer les * Les fichiers .dll que vous avez ajoutés à votre projet pour faire les choses. –

+0

Avez-vous essayé fenêtre largeur fenêtre niveau s'il vous plaît, si oui comment – AMH

1

Vérifiez également Steve, comme il fonctionne dans ClearCanvas. J'ai vu sa réponse (et la confirmation à ce sujet) dans la question this StackOverflow.

+0

Merci! Oui, j'ai vu cette question aussi. – stiank81

0

Ok, j'ai réussi à montrer une image DICOM dans un Picturebox en utilisant ce code:

Voici les ensembles I utilisés:

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; 

Je devais aussi copier ces dll dans bin/debug:

BilinearInterpolation.dll (celui-ci je l'ai référence could'nt comme assemblie donc je viens de copier dans le répertoire bin/dossier degug)

WindowsBase.dll (ce que je w en mesure de faire référence comme assemblie)

code

(Il y a un bouton dans mon projet qui vous permet de sélectionner le fichier dcm puis le montrer dans 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(); 
     } 
    }