You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm中在PictureBox加载DICOM图片时触发OutOfMemoryException

解决WinForms加载DICOM图片时的OutOfMemoryException错误

问题原因

System.Drawing.Image.FromFile并不支持DICOM(.dcm)格式文件,你遇到的OutOfMemoryException是格式不兼容导致的误导性异常,并非系统内存不足。直接用该方法加载DICOM文件会失败。

解决方案

使用专门的DICOM处理库将DICOM文件转换为WinForms可识别的Bitmap对象,推荐使用fo-dicom(轻量且易用的开源DICOM库)。

步骤1:安装fo-dicom库

在Visual Studio中通过NuGet包管理器安装fo-dicom.Desktop包。

步骤2:修改代码

替换原代码中加载图片的逻辑,改用fo-dicom读取DICOM并转换为Bitmap:

private void run_Click(object sender, EventArgs e)
{
    string inputFolderPath = SrcTextBox.Text;
    string outputFolderPath = DstTextBox.Text;

    string[] dicomFiles = Directory.GetFiles(inputFolderPath, "*.dcm");

    if (dicomFiles.Length > 0)
    {
        OpenFileDialog openFileDialog1 = new OpenFileDialog();
        openFileDialog1.Filter = "DICOM Files|*.dcm";
        openFileDialog1.Title = "Select First Reference DICOM File";

        if (openFileDialog1.ShowDialog() == DialogResult.OK)
        {
            // 使用fo-dicom读取DICOM文件
            var dicomFile = DicomFile.Open(openFileDialog1.FileName);
            var image = new DicomImage(dicomFile.Dataset);
            Bitmap bitmap = image.RenderImage().AsBitmap();

            // 创建PictureBox并设置图片
            PictureBox pictureBox = new PictureBox();
            pictureBox.SizeMode = PictureBoxSizeMode.Zoom; // 改用Zoom适配窗体大小
            pictureBox.Dock = DockStyle.Fill; // 让PictureBox填满窗体
            pictureBox.Image = bitmap;

            // 创建新窗体并添加控件
            Form form = new Form();
            form.Size = new Size(800, 600);
            form.Controls.Add(pictureBox);

            // 避免重复引用同一个Image对象,移除BackgroundImage赋值
            // form.BackgroundImage = pictureBox.Image;

            form.ShowDialog();

            // 释放资源(可选,窗体关闭时自动释放,但显式释放更稳妥)
            form.FormClosed += (s, args) =>
            {
                pictureBox.Image?.Dispose();
                bitmap?.Dispose();
            };
        }
        else
        {
            Console.WriteLine("No reference file selected. Exiting.");
            return;
        }
    }
    else
    {
        MessageBox.Show("No DICOM files found in the selected directory.");
    }
}

关键修改点

  • 用DicomFile.Open读取DICOM文件,DicomImage.RenderImage().AsBitmap()将其转换为Bitmap
  • 调整PictureBox的SizeMode为Zoom并设置Dock = DockStyle.Fill,让图片更好适配窗体
  • 移除了form.BackgroundImage的赋值,避免同一个Bitmap被多个控件引用导致资源问题
  • 添加窗体关闭时的资源释放逻辑,防止内存泄漏

内容的提问来源于stack exchange,提问作者kurmi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:46:26