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
сообщение:
Похоже, что это ошибка.NET Framework, но, возможно, есть способ исправить это override
ИНГ OnPaint()
метод PictureBox
контроль?
Кто-нибудь видел эту ошибку ранее?
Заранее спасибо.
PS При разработке этого проекта я использую следующее программное обеспечение:
- Windows 10 x64
- Visual Studio 2017 Community Edition
- .NET Framework 4.5.1
- fo-dicom версия 3.0.2
РЕДАКТИРОВАТЬ #1
Та же проблема с Panel
вместо PictureBox
:
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 ();