首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FO-DICOM:使用C# Windows窗体应用程序中呈现的位图调整窗口大小会导致崩溃。

FO-DICOM:使用C# Windows窗体应用程序中呈现的位图调整窗口大小会导致崩溃。
EN

Stack Overflow用户
提问于 2018-02-02 20:22:42
回答 2查看 1.4K关注 0票数 2

我最近开始评估fo-dicom作为未来项目的DICOM库的可能性,所以我对它非常陌生。

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

代码语言:javascript
复制
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()中。

代码语言:javascript
复制
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下载测试应用程序)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-06 08:51:09

我的一个同事知道答案。下面的代码可以做到这一点:

代码语言:javascript
复制
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 )。

票数 3
EN

Stack Overflow用户

发布于 2018-03-13 10:06:57

这在fo-dicom中是一个已知的问题,并且已经有了一个解决方案,它将包含在下一个版本中。解释是,AsBitmap()方法返回一个位图,其像素数据指向属于IImage实例的内存。如果IImage实例处理,则位图的指针无效。这对于性能原因和内存消耗是很好的,因为像素数据不需要重复。因此,这不是一个错误,而是按照设计。

新的发行版将有两种方法:一种是das的行为与当前的最佳性能相似,另一种是通过复制自己的像素数据返回位图。

如果您有建议或评论,请随意将它们添加到github的问题中:

https://github.com/fo-dicom/fo-dicom/issues/634

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48590344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档