【转】【C#】使用fo-dicom完成BMP,JPG,PNG图片转换为DICOM文件

转自:https://developer.aliyun.com/article/672065

最近研究了一下DICOM和BMP文件转换的问题,也是很头大。度娘了很久,也在CSDN等论坛看到一些断断续续的文件,最主要的是代码只是片断,不是完整的实现。头大了。
首先,了解一下BMP文件格式,BMP文件的显示是从左下开始显示,而DICOM显示图像是从左上开始。所以如果你直接解析BMP文件的话,记得数据区工反转一下,否则生成DICOM时看到的图像是倒着的。只需要反转BMP图像的行,列不需要反转。
不过好在Microsoft的C#给我们提供了一个较好的类库叫Bitmap类,使用它可以不用管这个反转了。
首先要从BMP图中获取图像数据区,代码如下:

        public static byte[] GetPixels(Bitmap bitmap){byte[] bytes = new byte[bitmap.Width * bitmap.Height*3];int wide = bitmap.Width;int i = 0;int height = bitmap.Height;for (int y = 0; y < height; y++){for (int x = 0; x < wide; x++){var srcColor = bitmap.GetPixel(x, y);//bytes[i] = (byte)(srcColor.R * .299 + srcColor.G * .587 + srcColor.B * .114);bytes[i] = srcColor.R;i++;bytes[i] = srcColor.G;i++;bytes[i] = srcColor.B;i++;}}return bytes;}

申请的数据为什么是图像的宽高乘积的3倍,这是因为R,G,B各占一个Byte。如果采用上面代码中注释的行,生成的DICOM文件图像就是灰度图像(黑白图了)。
然后是真正的转存DICOM文件了。代码如下:

        public static void ImportImage(string file){Bitmap bitmap = new Bitmap(file);//bitmap = GetValidImage(bitmap);byte[] pixels = GetPixels(bitmap);MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);DicomDataset dataset = new DicomDataset();//FillDataset(dataset);dataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);dataset.Add(DicomTag.Rows, (ushort)bitmap.Height);dataset.Add(DicomTag.Columns, (ushort)bitmap.Width);dataset.Add(DicomTag.BitsAllocated, (ushort)8);dataset.Add(DicomTag.SOPClassUID, "1.2.840.10008.5.1.4.1.1.2");dataset.Add(DicomTag.SOPInstanceUID, "1.2.840.10008.5.1.4.1.1.2.20181120090837121314");DicomPixelData pixelData = DicomPixelData.Create(dataset, true);pixelData.BitsStored = 8;//pixelData.BitsAllocated = 8;pixelData.SamplesPerPixel = 3;pixelData.HighBit = 7;pixelData.PixelRepresentation = 0;pixelData.PlanarConfiguration = 0;pixelData.AddFrame(buffer);DicomFile dicomfile = new DicomFile(dataset);dicomfile.Save(@"e:\dicomfile.dcm");SaveDicomFile2(pixels, bitmap.Height, bitmap.Width);}

其中传入参数就是BMP/JPG/PNG图像的路径。这样你只需要一个入口程序(比如控制台的Main函数)就可以将一个图片转为DICOM还是彩色的。
这里只设置了DICOM必须的几个字段,这几个字段的意义可以参考官方标准说明。部分说明如下:
DICOM文件格式:
1)Samples Per Pixel:

    标签为(0028,0002),具体的介绍在DICOM3.0标准第3部分的附录C7.6.3.1。含义表示【the number of separate planes in this image】,就像PhotoShop中的通道,每个通道表示一种颜色(除了RGB三个通道以外,也会存在第四个通透性通道)。对于灰度图像(monochrome或gray)和颜色表图像(palette,就是BMP格式中介绍的有调色板的BMP文件),该标签值为1,RGB图像或其他色彩模式图像,该标签值为3。本实例中使用的BMP图像是RGB格式的,因此SamplePerPixel=3,起初的文件格式错误就是由于该字段设置为1所致。

2)Photometric Interpretation:

    标签为(0028,0004),具体介绍在DICOM3.0标准第3部分的附录C7.6.3.1.2。该字段常见的值有MONOCHROME1、MONOCHROME2、PALETTE COLOR、RGB,其中MONOCHROME1和MONOCHROME2表示单通道灰度图像,只是两者对黑色和白色的映射相反而已;PALETTE COLOR就是BMP中提到的调色板图像,此时需要SamplesPerPixel字段为1,;RGB是常见的R(红)、G(绿)、B(蓝)三通道彩色图像,此时SamplesPerPixel字段值为3,这就是我们实例中使用的图像。除此以外DICOM3.0标准中还给出了YBR_FULL、HSV、ARGB、CMYK等方式,此处就不详细介绍了。

3)Planar Configuration:

    标签为(0028,0006),具体介绍在DICOM3.0标准第3部分附录C7.6.3.1.3。当Samples Per Pixel字段的值大于1时,Planar Configuration字段规定了实际像素信息的存储方式,具体如下:

20150727112322434
BitsAllocated 每一种颜色值所分配的存储位数,一般彩色是8,灰度可以设置到16,不能大于16。
BitsStored 像素值的实际存储位数
HighBit 像素值存储的最高位(一般是BitsStored-1)。
关于BMP文件格式说明可参照:https://blog.csdn.net/zjq_1314520/article/details/53830349

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436099.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(转载)攻击方式学习之(1) - 跨站式脚本(Cross-Site Scripting)

原文地址&#xff1a;http://www.cnblogs.com/coderzh/archive/2008/09/06/1285500.html 声明&#xff1a;本文仅供学习研究之用&#xff0c;对于本文提到的某些网站的XSS漏洞&#xff0c;请读者发扬高尚的人道主义精神不要去危害他人&#xff0c;同时希望相应的网站能够尽快修…

C++设计模式之二 AbstractFactory模式

设计模式的目的就是尽量减少“变化”对程序的影响&#xff0c;尤其是对客户程序的影响。AbstractFactory模式作为创建型模式的一种&#xff0c;解决的就是“new”在变化中可能引起的问题。 先来看看new有何种不好&#xff0c;举个创建汽车的车门的例子&#xff1a; 很自然的一…

oracle win10配置命令,记一次Windows 平台下Oracle 10.2.0.5 EM重新配置

1. 删除EM资料库、dbconsole配置D:\>emca -deconfig dbcontrol db -repos dropEMCA 开始于 2013-2-20 9:53:17EM Configuration Assistant, 10.2.0.5.0 正式版版权所有 (c) 2003, 2009, Oracle。保留所有权利。输入以下信息:数据库 SID: ora10g监听程序端口号: 1521SYS 用户…

【转】Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)

转自&#xff1a;https://www.jianshu.com/p/2812b0b6e548 引言 DICOM(Digital Imaging and Communications in Medicine)医学数字成像与通信&#xff0c;是医疗影像领域一个非常重要的标准&#xff0c;本文主要简单介绍 DICOM 标准中的消息交换服务。在介绍之前先声明一下&am…

改写DataCogs在MOSS列表中实现三级联动字段

项目中有需求需要实现列表中3级的字段联动。参照小熊的[分享]修复DataCogs二级联动FieldControl支持中文 &#xff0c;改造一下&#xff0c;实现了3级联动字段。另外&#xff0c;还可以实现一个列表中同时有两个&#xff0c;或两个以上互相独立的联动字段&#xff0c; 详细的字…

wince 常见问题

1 在mediaplayer全屏播放的时候&#xff0c;我可以用键盘上的某一个键调节声音大小&#xff0c;现在我想在屏幕上显示调节的结果就跟我们看电视一样能出来一些标记。当声音变大在屏幕上就增多&#xff0c; 当声音变小的时候就减少 得到播放窗口的DC&#xff0c;然后在上面显示…

【转】01.Dicom 学习笔记-DICOM C-Store 消息服务

转自&#xff1a;https://www.jianshu.com/p/bab6a85d3486 引言 之前总体介绍了 DICOM 的消息服务&#xff0c;可以参考这篇博文&#xff0c;但是有关每个服务的详细信息没有讲解&#xff0c;本文就结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Store 服务。 名词简介 在正式讲…

Oracle客房管理系统论文,[转载]基于WEB的酒店管理系统论文【1】

摘要现代化的酒店组织庞大、服务项目多、信息量大&#xff0c;要想提高劳动生产、降低成本、提高服务质量和管理水平&#xff0c;进而促进经济效益&#xff0c;必须借助计算机来进行现代化的信息管理。酒店管理系统正是为此而设计的。优秀的酒店客房管理系统操作方便&#xff0…

使用C#和Excel进行报表开发(四)-复制单元格 【转】

在用Excel作报表的时候&#xff0c;可能会碰到分页的情况&#xff0c;这样就要分成多个Sheet显示&#xff0c;如果要在每页都保留表头&#xff0c;就需要将第一页作为模板设计的表头部分拷贝到其他的Sheet上&#xff0c;这时就要用用到Excel中的单元格拷贝。下面的代码说明如何…

【转】02.Dicom 学习笔记-DICOM C-Find 消息服务

引言 前篇介绍了 DICOM C-Store 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Find 服务。 C-Find 消息服务 C-Find 服务是一个查询服务&#xff0c;用于一个 DIMSE-service-user 在同等的DIMSE-service-user 上查询复合 SOP 实例的属性满足查询条件给出…

C++设计模式之三 单例模式

《Singleton.h》 #include<iostream> #include<string> using namespace std; class A{ public: static A* GetInstance(); void ShowAddress(); private: A(); virtual ~A(); static A* m_p; }; 《Singleton.cpp》 #include "Singleton.h&q…

oracle停止trace日志,关闭ORACLE客户端trace日志

TRACE时的注意事项1、确保所需trace组建的配置文件存在缺省情况下&#xff0c;Oracle会从下列位置搜索网络配置文件a.TNS_ADMIN environment variable (incl. Windows Registry Key)b./etc or /var/opt/oracle (Unix)c.$ORACLE_HOME/network/admin (Unix)d.%ORACLE_HOME%/Netwo…

随手小记·080911

随手小记 郑昀玩聚SD(科技、体育、娱乐)&#xff1a;1&#xff1a; 叙事逻辑的来历 在我漫长的Blog阅读史中&#xff0c;我整理出自己两种最常用的阅读方式&#xff1a;按照热点主题的阅读方式&#xff0c;跳过大段大段阐述直接阅读文中最经典的话&#xff0c;于是&#xff0c;…

【转】03.Dicom 学习笔记-DICOM C-Get 消息服务

转自&#xff1a;https://www.jianshu.com/p/c7f5b9fa597c 引言 前篇介绍了 DICOM C-Find 消息服务&#xff0c;本文结合开源 DICOM 库 fo-dicom 详细介绍一下 C-Get 服务。 C-Get 消息服务 C-Get 服务主要用于获取影像&#xff0c;用于一个 DIMSE-service-user 在同等的DIMSE…

php dao类设计,DAO数据访问对象设计 - GoFrame官网 - 类似PHP-Laravel, Java-SpringBoot的Go企业级开发框架...

关于DAO数据访问对象设计其实是关于GoFrame框架工程化实践中比较重要一块设计。DAO设计结合GoFrame的ORM组件性能和易用性都很强&#xff0c;可以极大提高开发和维护效率。看完本章节内容之后&#xff0c;小伙伴们应该能够理解并体会到使用DAO数据库访问对象设计的优点。一、现…

再谈“我是怎么招聘程序员的”

我以前写过一篇“我是怎么招聘程序员的”的文章&#xff08;在CSDN那里有很多人进行了回复&#xff09;。今天&#xff0c;我想再谈谈关于招聘和面试这方面的东西&#xff0c;主要是以下这些原因&#xff1a; 近半年来我在进行了大量的招聘工作&#xff0c;对面试有一些新的体…

[SAP FI] Bank Master Vendor Master Creation Related Knowledge

*. Bank Key含义 Q : 国外的一个客户想要做Automatic Banking,需要输入bank key 和bank account在供应商主数据中, 问题是银行中文名字只能作为地址输入, 现在是关键的Bank key使用银行的英文简写加拼音的组合,比如中国工商银行上海分行,就使用ICBC_SH来代替这样子.而bank ac…

【转】DICOM图像像素值、灰度值与CT值!!!!!

转自&#xff1a;https://blog.csdn.net/syz201558503103/article/details/107238940 做医学图像处理会涉及DICOM图像&#xff0c;初学者应该要对图像像素有一定了解&#xff0c;在对像素处理中会一些算法会利用的更好。 图像灰度值的概念是什么&#xff1f;灰度也可以认为是…

linux服务器cc防御,Linux下简单的防止CC攻击

Nginx 0.7开始提供了2个限制用户连接的模块&#xff1a;NginxHttpLimitZoneModule和NginxHttpLimitReqModule。NginxHttpLimitZoneModule可以根据条件进行并发连接数控制。NginxHttpLimitReqModule可以根据条件进行请求频率的控制。http {limit_zone my_zone $binary_remote_ad…

深入浅出单实例Singleton设计模式

深入浅出单实例Singleton设计模式 陈皓 前序 单实例Singleton设计模式可能是被讨论和使用的最广泛的一个设计模式了&#xff0c;这可能也是面试中问得最多的一个设计模式了。这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的&#xff0c;比如…