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
相关产品推荐
相关产品推荐

