FO-DICOM:在C#Windows窗体应用程序中使用渲染位图调整窗口大小会导致崩溃

FO-DICOM:在C#Windows窗体应用程序中使用渲染位图调整窗口大小会导致崩溃,c#,bitmap,dicom,fo-dicom,C#,Bitmap,Dicom,Fo Dicom,我最近开始评估fo dicom作为未来项目可能的dicom库,所以我对它相当陌生 我构建了一个基本的C#Windows窗体应用程序,它只读取DICOM文件,将其转换为System.Drawing.Bitmap,并显示在PictureBox: public partial class TestFoDicomForm : Form { public TestFoDicomForm() { InitializeComponent(); DicomIma

我最近开始评估fo dicom作为未来项目可能的dicom库,所以我对它相当陌生

我构建了一个基本的C#Windows窗体应用程序,它只读取DICOM文件,将其转换为
System.Drawing.Bitmap
,并显示在
PictureBox

public partial class TestFoDicomForm : Form
{
    public TestFoDicomForm()
    {
        InitializeComponent();

        DicomImage di               = new DicomImage("Image_01.dcm");
        Bitmap bmp                  = di.RenderImage().AsBitmap();
        this._pbDicomImage.Image    = bmp;
    }
}
此代码起作用,但如果我开始调整窗体的大小,则会出现一个异常,该异常出现的时间要早于之后:

System.ArgumentException:参数无效

在System.Drawing.Image.get_RawFormat()
在System.Drawing.Graphics.DrawImage(图像图像,Int32 x,Int32 y,Int32宽度,Int32高度)
在System.Drawing.Graphics.DrawImage(图像图像,矩形矩形)
在System.Windows.Forms.PictureBox.OnPaint(PaintEventArgs pe)中
在System.Windows.Forms.Control.PaintEventArgs处理(PaintEventArgs e,Int16层)
在System.Windows.Forms.Control.WmPaint(Message&m)中
在System.Windows.Forms.Control.WndProc(Message&m)中
在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message&m)中
在System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和消息)
在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd、Int32 msg、IntPtr wparam、IntPtr lparam)中

异常实际上发生在
Main()

但我无法添加一个有效的
try/catch
来调查发生了什么

我通过NuGet添加了对fo dicom 3.0.2的引用(该项目的目标框架是4.6.1)。环境:Windows 10 Pro,VS 2017

有趣的是,如果我按照上面的代码生成位图,然后存储它,然后在应用程序中读取它(不参考DICOM)并放入图片框中,则不会发生类似的情况。这使我认为问题在于位图本身,但我无法发现,什么

我还有一个使用fo-dicom.1.0.37制作的旧测试应用程序,它在调整大小时不会崩溃

我很好奇原因可能是什么,如何消除这种影响,或者/或者我可能做错了什么


(我希望可以从下载测试应用程序)。

我的一位同事知道答案。下面的代码执行以下操作:

public partial class TestFoDicomForm : Form
{
    private IImage image;

    public TestFoDicomForm()
    {
        InitializeComponent();

        this.image = new DicomImage("Image_01.dcm").RenderImage();
        Bitmap bmp = image.AsBitmap();
        this.pictureBox1.Image  = bmp;
    }
}

这里的技巧是,您需要保存
IImage
(由于返回类型为
RenderImage()
),因此必须以
IImage
)的形式保存实例。

这是fo dicom中的一个已知问题,并且已经有一个修复程序,将包含在下一版本中。 解释是,AsBitmap()方法返回一个位图,其像素数据指向IImage实例拥有的内存。如果IImage实例被处置,则位图的指针无效。 这对于性能和内存消耗来说是非常好的,因为不必复制像素数据。因此,这不是一个bug,而是设计好的

新版本将有两种方法:一种das的行为类似于当前具有最佳性能的das,另一种返回位图并复制其自身的像素数据

如果您有建议或意见,请随时将其添加到github上的问题:


谢谢gofal3,不过有一点耽搁。我已经使用了下面的解决方法。不客气。抱歉耽搁了。如github上所示,如果您对fo-dicom有进一步的疑问,则更活跃的社区位于gitter.im/fo-dicom/fo-dicom上
public partial class TestFoDicomForm : Form
{
    private IImage image;

    public TestFoDicomForm()
    {
        InitializeComponent();

        this.image = new DicomImage("Image_01.dcm").RenderImage();
        Bitmap bmp = image.AsBitmap();
        this.pictureBox1.Image  = bmp;
    }
}