C# System.Drawing.Image.get_Width() выбрасывает исключение в форме WinForms максимально

Я пишу Windows Forms Application приложение, которое должно показать изображение на PictureBox контроль.

Чтобы получить это изображение из DICOMDIR файл, который я использую fo-dicom библиотека (управляемая этим руководством):

....
private void MainForm_Load(object sender, EventArgs e)
{
    ImageManager.SetImplementation(WinFormsImageManager.Instance);
}
....

// this function is just for example
// real function is bit complicated
private void ShowImage()
{
    // Getting DICOM file, retrieving all info from it
    // Getting dicomDataset instance
    ....

    var id = dicomDataset.Get<string>(DicomTag.ReferencedFileID, -1);
    var dicomImage = new DicomImage(id);
    var bitmap = dicomImage.RenderImage().AsBitmap();
    pictureBox.Image = bitmap ?? pictureBox.ErrorImage;
}

Когда изображение восстанавливается, все работает нормально. Но как только я maximize мой MainForm, Я получил System.ArgumentException с Parameter is not valid сообщение:

System.ArgumentException

Похоже, что это ошибка.NET Framework, но, возможно, есть способ исправить это override ИНГ OnPaint() метод PictureBox контроль?

Кто-нибудь видел эту ошибку ранее?

Заранее спасибо.

PS При разработке этого проекта я использую следующее программное обеспечение:

  1. Windows 10 x64
  2. Visual Studio 2017 Community Edition
  3. .NET Framework 4.5.1
  4. fo-dicom версия 3.0.2

РЕДАКТИРОВАТЬ #1

Та же проблема с Panel вместо PictureBox:

ArgumentException

1 ответ

Вы столкнулись с известной и уже исправленной ошибкой в ​​fo-dicom 3.0.2. Смотрите также https://github.com/fo-dicom/fo-dicom/issues/634. По соображениям производительности растровое изображение, которое возвращает DicomImage.RenderImage().AsBitmap(), не имеет собственных данных пикселей, но имеет указатель на байты DicomImage. Таким образом, AsBitmap () не дублирует все данные пикселей в памяти. Но если вы создаете экземпляр DicomImage в локальной переменной и сохраняете растровое изображение в элементе управления, тогда DicomImage располагается в конце метода, и данные пикселей получают сборщик данных. В следующий раз, когда Bitmap пытается получить доступ к пиксельным данным, происходит это исключение.

В следующем выпуске будет два метода: AsSharedBitmap() - такой же, как сейчас, но более очевидный для пользователя - и AsClonedBitmap().

Обходной путь теперь состоит в том, чтобы скопировать данные пикселей вручную, вызвав:

var bitmap = dicomImage.RenderImage (). AsBitmap ().Clone ();

Другие вопросы по тегам