Преобразование изображения Simpleitk в растровое изображение. System.ArgumentException

Я хочу прочитать изображение dicom с помощью simpleitk, преобразовать его в растровое изображение, а затем отобразить результат в PictureBox. Но когда я пытаюсь это сделать, выдается исключение ArgumentException. Как я могу это решить?

Вот мой код:

OpenFileDialog dialog = new OpenFileDialog();
dialog.Title = "Open";
dialog.Filter = "DICOM Files (*.dcm;*.dic)|*.dcm;*.dic|All Files (*.*)|*.*";
dialog.ShowDialog();
if (dialog.FileName != "")
{
    using (sitk.ImageFileReader reader = new sitk.ImageFileReader())
    {
        reader.SetFileName(dialog.FileName);                   
        reader.SetOutputPixelType(sitk.PixelIDValueEnum.sitkFloat32);
        sitk.Image image = reader.Execute();

        var castedImage = sitk.SimpleITK.Cast(image, 
            sitk.PixelIDValueEnum.sitkFloat32);
        var size = castedImage.GetSize();
        int length = size.Aggregate(1, (current, i) => current * (int)i);
        IntPtr buffer = castedImage.GetBufferAsFloat();

        // Declare an array to hold the bytes of the bitmap.                    
        byte[] rgbValues = new byte[length];

        // Copy the RGB values into the array.
        Marshal.Copy(buffer, rgbValues, 0, length);

        Stream stream = new MemoryStream(rgbValues);

        Bitmap newBitmap = new Bitmap(stream);

        //I have tried in this way, but it generated ArgumentException too
        //Bitmap newBitmap = new Bitmap((int)image.GetWidth(), (int)image.GetHeight(), (int)image.GetDepth(), PixelFormat.Format8bppIndexed, buffer);

        Obraz.pic.Image = newBitmap;
    }
}

person PAPP    schedule 05.01.2016    source источник
comment
вы должны проверять свой OpenFileDialog вот так if (dialog.ShowDialog() == DialogResult.OK){ } также, в какой строке происходит ошибка .. вы использовали отладчик ..? искали ли вы в Google какие-либо функции BitMap Converter ... и т. д.?   -  person MethodMan    schedule 06.01.2016
comment
Спасибо за ваш ответ. Вы правы, я должен проверить свой OpenFileDialog, как вы сказали. Ошибка возникает в строке: New Bitmap bitmap = new Bitmap (stream); Я искал в Google, как создать растровое изображение из потока или буфера и как преобразовать SimpleITK.Image в изображение или растровое изображение.   -  person PAPP    schedule 06.01.2016
comment
Вы проверили условие исключения: поток не содержит данных изображения или имеет значение null. -или- поток содержит файл изображения PNG с одним размером больше 65 535 пикселей?   -  person Jacob Seleznev    schedule 06.01.2016
comment
попробуйте этот пример ImageGetBuffer.cs. Обратите внимание на использование float[] вместо byte[]   -  person Jacob Seleznev    schedule 06.01.2016


Ответы (1)


Спасибо за комментарии и попытки помочь. После консультаций и собственных поисков в Интернете я решил эту проблему. Первой проблемой было неадекватное представление пиксельного изображения. Мне пришлось изменить Float32 на UInt8, чтобы обеспечить восьмибитный пиксель.

var castedImage = sitk.SimpleITK.Cast(image2, sitk.PixelIDValueEnum.sitkUInt8);

Тогда я бы уже создал Bitmap, используя конструктор, который был закомментирован в вопросе, но с (int) image.GetWidth () вместо (int) image.GetDepth ().

Bitmap newBitmap = new Bitmap((int)image.GetWidth(), (int)image.GetHeight(), (int)image.GetWidth(), PixelFormat.Format8bppIndexed, buffer);

К сожалению, появилась новая проблема. Изображение, которое должно было быть в серой шкале, отображалось странными цветами. Но я нашел решение здесь

ColorPalette pal = newBitmap.Palette;
                for (int i = 0; i <= 255; i++)
                {
                    // create greyscale color table
                    pal.Entries[i] = Color.FromArgb(i, i, i);
                }
                newBitmap.Palette = pal; // you need to re-set this property to force the new ColorPalette
person PAPP    schedule 08.01.2016
comment
Как вы импортировали библиотеку Simpleitk. Когда я пытаюсь импортировать библиотеки DLL с помощью regsvr32, получаю такую ​​ошибку: SimpleITKCSharpNative.dll was loaded but the entry-point DllRegisterServer was not found - person talha06; 22.05.2016