C # System.Drawing.Image.get_Width () выбрасывает исключение в форме WinForms максимально - PullRequest
0 голосов
/ 13 мая 2018

Я пишу 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 ing OnPaint() метода PictureBox control?

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

Спасибозаранее.

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

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

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

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

ArgumentException

1 Ответ

0 голосов
/ 13 мая 2018

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

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

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

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

...