2010-09-06 3 views
2

Я пытаюсь показать изображение dicom с помощью openDicom.net. Что я должен здесь исправить?C# как показать изображение в картинке

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

Каким образом это не работает? Получаете ли вы какие-то исключения (если да, что они говорят)? –

+4

Попробуйте вместо объекта изображения. Image.FromFile очень удобен для этого. – 2010-09-06 19:34:15

+0

есть ошибка: «Невозможно неявно преобразовать тип« openDicom.Image.PixelData »в« System.Drawing.Image »» – luc

ответ

1

PixelData - не изображение. PixelData - это необработанная информация об изображении. По моему опыту, большинство файлов DICOM будут использовать jpeg2000 изображения. Чтобы преобразовать их в нечто, используемое PictureBox, вам нужно будет преобразовать его в изображение. Для сырых типов монохромных, вы можете сделать это в System.Drawing.Bitmap, используя следующую конвертацию:

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

Для других типов изображений, вам нужно сделать аналогичное преобразование с соответствующими значениями. Это преобразование строго для монохромных типов и только после того, как они были преобразованы из jpeg2000 в jpeg. Выполнение этой операции на изображении jpeg2000 даст вам ровно половину изображения, заполненного статикой, а другая половина полностью пуста.

+0

Откуда вы получаете класс PixelData16? – Glimpse

Смежные вопросы