2

我编写应该在控件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.ArgumentExceptionParameter is not valid

System.ArgumentException

看起来这是一个 .NET Framework 错误,但也许有办法通过控制方法来override修复OnPaint()PictureBox

有没有人以前看到过这个错误?

提前致谢。

PS 在开发这个项目期间,我使用以下软件:

  1. 视窗 10 x64
  2. Visual Studio 2017 社区版
  3. .NET 框架 4.5.1
  4. fo-dicom 版本 3.0.2

编辑#1

Panel与而不是相同的问题PictureBox

参数异常

4

1 回答 1

3

您正面临 fo-dicom 3.0.2 中已知且已修复的错误。另请参阅https://github.com/fo-dicom/fo-dicom/issues/634。出于性能原因,DicomImage.RenderImage().AsBitmap() 返回的位图没有自己的像素数据,但有一个指向 DicomImage 字节的指针。所以 AsBitmap() 不会复制内存中的所有像素数据。但是,如果您在局部变量中实例化 DicomImage 并将 Bitmap 保存在控件中,则 DicomImage 会在方法结束时被处理,并且像素数据会被垃圾收集。下一次,Bitmap 会尝试访问像素数据,发生此异常。

下一个版本将有两种方法:AsSharedBitmap() - 与现在相同,但对用户来说更明显 - 和 AsClonedBitmap()。

现在的解决方法是,通过调用手动复制像素数据:

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

于 2018-05-13T15:59:38.223 回答