【C#】使用fo-dicom完成DICOM文件图像转换为BMP等

简介:

直接上代码:

            DicomFile dcmFile = DicomFile.Open(filename);
            var name = dcmFile.Dataset.GetString(DicomTag.PatientName);
            ushort bitStore = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.BitsStored);
            ushort bitAlloced = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.BitsAllocated);
            ushort simplePerPixel = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.SamplesPerPixel);
            ushort width = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.Columns);
            ushort height = dcmFile.Dataset.GetSingleValue<ushort>(DicomTag.Rows);
            int windowCenter = dcmFile.Dataset.GetSingleValue<int>(DicomTag.WindowCenter);
            int windowWidth = dcmFile.Dataset.GetSingleValue<int>(DicomTag.WindowWidth);
            string modality = dcmFile.Dataset.GetString(DicomTag.Modality);
            var gdiImg = new Bitmap(width, height);
            if (bitStore > 8)
            {
                ushort[] datass = dcmFile.Dataset.GetValues<ushort>(DicomTag.PixelData);
                ushort maxVal = datass.Max();
                ushort minVal = datass.Min();
                double compressFactor = byte.MaxValue / (double)(maxVal - minVal) - 0.00000000001;
                if (simplePerPixel == 1) // gray
                {
                    System.Drawing.Color c = System.Drawing.Color.Empty;
                    for (int i = 0; i < height; i++)
                    {
                        for (int j = 0; j < width; j++)
                        {
                            int grayGDI;
                            double gray = datass[i*width + j];
                            //int grayStart = (windowCenter - windowWidth / 2);
                            //int grayEnd = (windowCenter + windowWidth / 2);
                            //if (gray < grayStart)
                            //{
                            //    grayGDI = 0;
                            //}
                            //else if (gray > grayEnd)
                            //{
                            //    grayGDI = 255;
                            //}
                            //else
                            //{
                            //    grayGDI = (int)((gray - grayStart) * 255 / windowWidth);
                            //}
                            //if (grayGDI > 255)
                            //{
                            //    grayGDI = 255;
                            //}
                            //else if (grayGDI < 0)
                            //{
                            //    grayGDI = 0;
                            //}
                            //if (modality == "CT")
                            //{
                            //    grayGDI = 255 - grayGDI;
                            //}

                            grayGDI = (int)(gray*compressFactor);
                            c = System.Drawing.Color.FromArgb(grayGDI, grayGDI, grayGDI);
                            gdiImg.SetPixel(j,i,c);
                        }
                    }
                    gdiImg.Save(@"e:\dicom2bmp.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
                }
                else if (simplePerPixel == 3) //RGB
                {
                    //c = Color.FromArgb(pixData[0], pixData[1], pixData[2]);
                }
            }
            else
            {
                byte[] datas = dcmFile.Dataset.GetValues<byte>(DicomTag.PixelData);
                if (simplePerPixel == 1) // gray
                {

                }
                else if (simplePerPixel == 3) //RGB
                {

                }
            }

代码只实现了灰度图像转换(图像存储为OW,OB的代码基本相同),彩色图像转换更简单。
目前代码存在的问题是转为DICOM图像后失真较严重,和直接查看DICOM文件有一定的差别。仅供学习参考。
同时图像存储的TAG不仅有7FE0,0010,还有7FE0,0008和7FE0,0009,这两种格式存储的DICOM文件暂时还没有。关于DICOM标准的研究也是在逐步进行中。
fo-dicom是一个跨平台的DICOM开源库,目前支持Android,iOS还有电脑。是值得学习的一个开源库。

目录
相关文章
|
2月前
|
数据采集 JavaScript C#
C#图像爬虫实战:从Walmart网站下载图片
C#图像爬虫实战:从Walmart网站下载图片
|
1月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
32 1
|
1月前
|
XML 存储 缓存
C#使用XML文件的详解及示例
C#使用XML文件的详解及示例
76 0
|
3月前
|
监控 安全 C#
使用C#如何监控选定文件夹中文件的变动情况?
使用C#如何监控选定文件夹中文件的变动情况?
115 19
|
3月前
|
编译器 C# Windows
C#基础:手动编译一个.cs源代码文件并生成.exe可执行文件
通过上述步骤,应该能够高效准确地编译C#源代码并生成相应的可执行文件。此外,这一过程强调了对命令行编译器的理解,这在调试和自动化编译流程中是非常重要的。
236 2
|
3月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
30 3
|
3月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
Unity数据加密☀️ 二、使用Rider将C#代码生成DLL文件
|
3月前
|
C#
C# 写日志文件
C# 写日志文件
42 0
|
7天前
|
C# 开发者
C# 一分钟浅谈:Code Contracts 与契约编程
【10月更文挑战第26天】本文介绍了 C# 中的 Code Contracts,这是一个强大的工具,用于通过契约编程增强代码的健壮性和可维护性。文章从基本概念入手,详细讲解了前置条件、后置条件和对象不变量的使用方法,并通过具体代码示例进行了说明。同时,文章还探讨了常见的问题和易错点,如忘记启用静态检查、过度依赖契约和性能影响,并提供了相应的解决建议。希望读者能通过本文更好地理解和应用 Code Contracts。
19 3
|
28天前
|
安全 C# 数据安全/隐私保护
实现C#编程文件夹加锁保护
【10月更文挑战第16天】本文介绍了两种用 C# 实现文件夹保护的方法:一是通过设置文件系统权限,阻止普通用户访问;二是使用加密技术,对文件夹中的文件进行加密,防止未授权访问。提供了示例代码和使用方法,适用于不同安全需求的场景。