2009-10-30 12 views
7

Esta es una pregunta muy limitada y específica, pero sé que hay alguien más usando esto, así que mantendré mis dedos cruzados y espero que cualquiera de ustedes haga esta pregunta arriba.Cargue la imagen Dicom y muéstrela - usando la biblioteca ClearCanvas

Estoy trabajando en una aplicación WPF donde una parte es un visor de Dicom. Nos gustaría utilizar un componente de terceros para manejar las cosas de Dicom, y ClearCanvas es de lo que tenemos la mejor impresión hasta ahora. Podemos cargar un archivo Dicom y obtener los atributos, pero tenemos problemas para mostrar los datos de la imagen en la propiedad Fuente de un control de imagen para mostrarlo. ¿Alguien con pistas sobre cómo hacer que esto suceda?

Aquí está el código que utilizo para la extracción de los datos de imagen:

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

también han intentado usar la biblioteca ImageViewer, pero sigue siendo los mismos datos ..

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

Respuesta

7

bien, pensé afuera ... Puede haber más maneras de lograr esto, pero esto es lo que hice. Ahora tengo una imagen Wpf vinculada a una propiedad que proporciona los datos de mapa de bits. La siguiente es la propiedad utilizada para proporcionar los datos de mapa de bits.

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

Tenga en cuenta que esta es una solución muy sencilla. Uno podría, p. Ej. desea hacer cosas como precargar las imágenes, etc. para evitar una gran carga al desplazar imágenes de multitrama. Pero para la pregunta "cómo mostrar la imagen", esto debería responderlo ...

+0

stiank81: ¿Podría por favor indique el * .dll archivos que agregó a su proyecto para hacer las cosas. –

+0

¿Has probado el nivel de ventana del ancho de la ventana, si es así cómo – AMH

1

También verifique Steve, ya que funciona en ClearCanvas. He visto su respuesta (y confirmación al respecto) en this Pregunta de StackOverflow.

+0

Gracias! Sí, también he visto esa pregunta. – stiank81

0

Ok, me las he arreglado para mostrar una imagen DICOM en un Cuadro de imagen utilizando este código:

Estos son los montajes que utilizan:

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; 

También tuve que copiar estos DLL en bin/depuración:

BilinearInterpolation.dll (éste ultimo could'nt referencia a ella como assemblie por lo que acaba de copiar en la carpeta bin/degug)

WindowsBase.dll (éste que w como capaz de hacer referencia a ella como un assemblie)

Código (Hay un botón en mi proyecto que le permite seleccionar el archivo de DCM y luego mostrarlo en un cuadro de imagen)

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