2010-09-06 17 views
2

J'essaie d'afficher l'image dicom en utilisant openDicom.net. Que dois-je corriger ici?C# comment afficher l'image dans la case d'image

openDicom.Image.PixelData obraz = new openDicom.Image.PixelData(file.DataSet); 
// System.Drawing.Bitmap obrazek = (Bitmap)Bitmap.FromFile(element); 
pictureBox1.Image = obraz; 
pictureBox1.Show(); 
+0

En quoi cela ne fonctionne-t-il pas? Avez-vous des exceptions (si oui, que disent-ils)? –

+4

Essayez plutôt avec un objet Image. Image.FromFile est très pratique pour ça. –

+0

il y a une erreur: "Impossible de convertir implicitement le type 'openDicom.Image.PixelData' en 'System.Drawing.Image'" – luc

Répondre

1

PixelData n'est pas une image. PixelData est une information d'image brute. D'après mon expérience, la plupart des fichiers DICOM utiliseront des images jpeg2000. Afin de les convertir en quelque chose utilisable par un PictureBox, vous aurez besoin de le convertir en une image. Pour les types de monochromes premières, vous pouvez le faire en utilisant System.Drawing.Bitmap la conversion suivante:

openDicom.Image.PixelData obraz = new openDicom.Image.PixelData(file.DataSet); 

Bitmap img = new System.Drawing.Bitmap(obraz.Columns, obraz.Rows, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 

int resampleval = (int)Math.Pow(2, (obraz.BitsAllocated - obraz.BitsStored)); 
int pxCount = 0; 
int temp = 0; 

try 
{ 
    unsafe 
    { 
     BitmapData bd = img.LockBits(new Rectangle(0, 0, obraz.Columns, obraz.Rows), ImageLockMode.WriteOnly, img.PixelFormat); 

     for (int r = 0; r < bd.Height; r++) 
     { 
      byte* row = (byte*)bd.Scan0 + (r * bd.Stride); 

      for (int c = 0; c < bd.Width; c++) 
      { 
       temp = PixelData16[pxCount]/resampleval; 

       while (temp > 255) 
        temp = temp/resampleval; 

       row[(c * 3)] = (byte)temp; 
       row[(c * 3) + 1] = (byte)temp; 
       row[(c * 3) + 2] = (byte)temp; 

       pxCount++; 
      } 
     } 

     img.UnlockBits(bd); 
    } 
} 
catch 
{ 
    img = new Bitmap(10, 10); 
} 

pictureBox1.Image = img; 
pictureBox1.Show(); 

Pour d'autres types d'images, vous aurez besoin de faire une conversion similaire avec les valeurs appropriées. Cette conversion est strictement pour les types monochromes, et seulement après avoir été convertis de jpeg2000 en jpeg. Effectuer cette opération sur une image jpeg2000 vous donnera exactement la moitié de l'image remplie de statique et l'autre moitié complètement vide.

+0

D'où obtenez-vous la classe PixelData16? – Glimpse