我最近开始评估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.PaintWithErrorHandling(PaintEventArgs e,Int16层) at System.Windows.Forms.Control.WmPaint(Message& m) at System.Windows.Forms.Control.WndProc(Message& m) 在System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)
异常实际上发生在Main()中。
Application.Run(new TestFoDicomForm());但我无法添加一个有效的try/catch来调查实际发生的情况。
我通过NuGet (项目的目标框架为4.6.1)添加了对fo-dicom 3.0.2的引用。环境: Windows 10 Pro,VS 2017。
有趣的是,如果我生成如上面代码所示的位图,然后存储它,并在应用程序中读取它(不引用DICOM)并将其放入图片框中,则不会发生类似的事情。这使我认为问题在于位图本身,但我无法发现,什么。
我还使用fo-dicom.1.0.37制作了一个旧的测试应用程序,它在调整大小时不会崩溃。
我很好奇原因是什么,如何消除这种影响或/以及我可能做错了什么。
(我希望可以从http://jmp.sh/UGOg8Ai下载测试应用程序)。
发布于 2018-02-06 08:51:09
我的一个同事知道答案。下面的代码可以做到这一点:
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 )。
发布于 2018-03-13 10:06:57
这在fo-dicom中是一个已知的问题,并且已经有了一个解决方案,它将包含在下一个版本中。解释是,AsBitmap()方法返回一个位图,其像素数据指向属于IImage实例的内存。如果IImage实例处理,则位图的指针无效。这对于性能原因和内存消耗是很好的,因为像素数据不需要重复。因此,这不是一个错误,而是按照设计。
新的发行版将有两种方法:一种是das的行为与当前的最佳性能相似,另一种是通过复制自己的像素数据返回位图。
如果您有建议或评论,请随意将它们添加到github的问题中:
https://stackoverflow.com/questions/48590344
复制相似问题