FO-DICOM:在C#Windows窗体应用程序中使用渲染位图调整窗口大小会导致崩溃
我最近开始评估fo dicom作为未来项目可能的dicom库,所以我对它相当陌生 我构建了一个基本的C#Windows窗体应用程序,它只读取DICOM文件,将其转换为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
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;
}
}