基于.NET4.0,如何在fo-dicom 1.x中获取未压缩RGB原始像素数据
用fo-dicom获取Philips超声图像的原始RGB数据方案
嘿,针对你用.NET4.0 + fo-dicom处理Philips Xcelera R4.1 L1超声图像的需求,我整理了具体的实现步骤,帮你拿到原始RGB像素数据用于标注:
核心思路
你的图像采用JPEG Baseline(1.2.840.10008.1.2.4.50)压缩传输语法,且光度学解释为RGB,fo-dicom的DicomImage类会自动处理解压逻辑,直接帮你拿到可用的原始像素数据。
具体实现代码
using Dicom; using Dicom.Imaging; using System.Drawing; // 用于Bitmap标注操作 // 1. 加载目标DICOM文件 var dicomFile = DicomFile.Open("你的超声图像路径.dcm"); // 2. 可选:手动注册JPEG编解码器(针对.NET4.0环境,确保解压正常) // 如果遇到解压错误,添加这行代码 DicomCodec.RegisterTranscoder(DicomTransferSyntax.JPEGProcess1, new DicomJpegCodec()); // 3. 创建DicomImage实例,自动完成JPEG解压 var dicomImage = new DicomImage(dicomFile.Dataset); // 4. 获取原始RGB字节数组 // 每个像素按R→G→B顺序存储,每个像素占3个字节 byte[] rawRgbData = dicomImage.RawData; // 5. 获取图像尺寸(用于后续标注时计算坐标) int imageWidth = dicomFile.Dataset.GetSingleValue<int>(DicomTag.Columns); int imageHeight = dicomFile.Dataset.GetSingleValue<int>(DicomTag.Rows); // --- 可选:直接转换为Bitmap进行标注操作 --- using (Bitmap annotationBitmap = dicomImage.RenderImage()) { using (Graphics g = Graphics.FromImage(annotationBitmap)) { // 示例:绘制一个红色矩形标注(按需替换成你的标注逻辑) g.DrawRectangle(Pens.Red, new Rectangle(20, 20, 80, 80)); // 也可以添加文字标注:g.DrawString("标注点", new Font("Arial", 12), Brushes.Blue, 100, 100); } // 保存标注后的图像或进一步处理 annotationBitmap.Save("标注后的图像.png"); }
关键注意事项
- 兼容性:你用的end-of-the-road分支是fo-dicom专门为旧框架(如.NET4.0)维护的分支,确保引用的NuGet包或编译的程序集是该分支的版本,避免版本不兼容问题。
- 像素格式验证:因为光度学解释是RGB,
rawRgbData的长度应该等于imageWidth * imageHeight * 3,如果不符,可以检查DICOM数据集里的BitsAllocated和SamplesPerPixel字段(RGB图像的SamplesPerPixel应为3)。 - 编解码器问题:如果运行时出现JPEG解压失败,确认已经引用了fo-dicom的编解码器组件(如
fo-dicom.Codecs),或者手动注册上面代码中的DicomJpegCodec。
内容的提问来源于stack exchange,提问作者user618886
相关产品推荐
相关产品推荐

