using Dicom;
using Dicom.Imaging;
using Dicom.IO.Buffer;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SuperIC.Common; namespace SuperIC.Web
{
public class ImageToDcm
{
USLogger logger = USLogger.GetLogger("FileCopyService");
public 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;
} public void ImportImage(string file, PacsModel pacsModel, string destFilePath, ref string serGuid, ref string destPath)
{
logger.Info("path:" + file); Bitmap bitmap = new Bitmap(file); if (string.IsNullOrEmpty(serGuid))
serGuid = getnum();
var seriesUid = getnum();
byte[] pixels = GetPixels(bitmap); MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
DicomDataset dataset = new DicomDataset(); dataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
dataset.Add(DicomTag.Rows, (ushort)bitmap.Height);
dataset.Add(DicomTag.Columns, (ushort)bitmap.Width);
//dataset.Add(DicomTag.SpecificCharacterSet, "GB18030");
dataset.Add(DicomTag.BitsAllocated, (ushort)8);
dataset.Add(DicomTag.SOPClassUID, getnum());
dataset.Add(DicomTag.SOPInstanceUID, getnum());
dataset.Add(DicomTag.Modality, pacsModel.EXAM_MODALITY);
dataset.Add(DicomTag.PatientName, pacsModel.NAME);
dataset.Add(DicomTag.StudyID, pacsModel.STUDYUID);
dataset.Add(DicomTag.PatientID, pacsModel.PATIENTID);
dataset.Add(DicomTag.PatientSex, pacsModel.SEX_CODE);
dataset.Add(DicomTag.StudyInstanceUID, serGuid);
dataset.Add(DicomTag.SeriesInstanceUID, seriesUid);
dataset.Add(DicomTag.StudyDate, pacsModel.EXAM_DTIME);
dataset.Add(DicomTag.PatientAge, (!string.IsNullOrEmpty(pacsModel.AGE) ? (System.Text.RegularExpressions.Regex.Replace(pacsModel.AGE, @"[^0-9]+", "").PadLeft(3, '0').PadRight(4, 'Y')) : ""));
dataset.Add(DicomTag.ConversionType, "DI");
dataset.Add(DicomTag.ImageType, @"ORIGINAL\PRIMARY"); 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);
destPath = seriesUid + ".dcm";
dicomfile.Save(destFilePath + seriesUid + ".dcm");
// SaveDicomFile2(pixels, bitmap.Height, bitmap.Width);
} //public void ImportImage1()
//{
// Bitmap bitmap = new Bitmap(@"E:\Test\111.jpeg"); // //if (string.IsNullOrEmpty(serGuid))
// // serGuid = getnum();
// var seriesUid = getnum();
// byte[] pixels = GetPixels(bitmap); // MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
// // MYIOManage.SetImplementation(MYIOManage.Instance);
// DicomDataset dataset = new DicomDataset(); // dataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
// dataset.Add(DicomTag.Rows, (ushort)bitmap.Height);
// dataset.Add(DicomTag.Columns, (ushort)bitmap.Width);
// // dataset.Add(DicomTag.SpecificCharacterSet, "GB18030");
// dataset.Add(DicomTag.BitsAllocated, (ushort)8);
// dataset.Add(DicomTag.SOPClassUID, getnum());
// dataset.Add(DicomTag.SOPInstanceUID, getnum());
// dataset.Add(DicomTag.Modality, "US");
// dataset.Add(DicomTag.PatientName, "旺旺");
// dataset.Add(DicomTag.StudyID, "1231212");
// dataset.Add(DicomTag.PatientID, "1231231");
// dataset.Add(DicomTag.PatientSex, "F");
// dataset.Add(DicomTag.StudyInstanceUID, getnum());
// dataset.Add(DicomTag.SeriesInstanceUID, seriesUid);
// dataset.Add(DicomTag.StudyDate, DateTime.Now);
// dataset.Add(DicomTag.PatientAge, "020Y");
// dataset.Add(DicomTag.ConversionType, "DI");
// dataset.Add(DicomTag.ImageType, @"ORIGINAL\PRIMARY"); // 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:\us\" + seriesUid + ".dcm");
//} public string getnum()
{
// var num = "1.2.156.112536.2.560.202009.1334022818108.1";
Random rnd = new Random(); var minValue = 0;
var maxValue = 9;
//1位数
refnum(1, out minValue, out maxValue);
var a = rnd.Next(minValue, maxValue); //2位数
//refnum(2, out minValue, out maxValue);
//var b = rnd.Next(minValue, maxValue); //3位数
refnum(3, out minValue, out maxValue);
var b = rnd.Next(minValue, maxValue); //6位数
refnum(6, out minValue, out maxValue);
var c = rnd.Next(minValue, maxValue); //10位数
refnum(10, out minValue, out maxValue);
var d = rnd.Next(minValue, maxValue); //1位数
refnum(1, out minValue, out maxValue);
var e = rnd.Next(minValue, maxValue); //3位数
refnum(3, out minValue, out maxValue);
var f = rnd.Next(minValue, maxValue); //10位数
refnum(10, out minValue, out maxValue);
var g = rnd.Next(minValue, maxValue); return "1." + a + "." + b + "." + c + "." + e + "." + f + "." + DateTime.Now.Date.ToString("yyyyMMdd") + d + "." + g;
} public void refnum(int num, out int minValue, out int maxValue)
{
switch (num)
{
case 1:
minValue = 1;
maxValue = 9; break;
case 3:
minValue = 100;
maxValue = 900; break;
case 6:
minValue = 100000;
maxValue = 999999; break;
case 10:
minValue = 1000000000;
maxValue = int.MaxValue;
break;
default:
minValue = 1000000000;
maxValue = int.MaxValue;
break;
} }
}
}
为防止在生成的时候会导致姓名等信息会出现乱码的,需要建一个初始化类。
这个最好是在程序启动的时候就初始化,因为放到生成图片里面才实例化,也会出现乱码的情况,使用方式如下

  MYIOManage.SetImplementation(MYIOManage.Instance);
using Dicom.IO;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace SuperIC.Web
{
/// <summary>
/// 点击(此处)折叠或打开MyIOManager.SetImplementation(MyIOManager.Instance);
///将fo-dicom使用的默认字符集修改一下。注意,我的类中BaseEncodingImpl取得的是Encoding.Default,意思就是取系统默认编码。这样在中文系统下就是GB2312或者GB18030了,就可以友好的支持中文了,而不 用在每次调用DicomDataSet的AddOrUpdate方法时指定编码了。是不是很方便呢。
/// </summary>
class MYIOManage : IOManager
{ public static readonly IOManager Instance = new MYIOManage(); private MYIOManage()
{ } protected override Encoding BaseEncodingImpl
{
get
{ return Encoding.Default;
}
} protected override IPath PathImpl
{
get
{
return DesktopPath.Instance;
}
} protected override IDirectoryReference CreateDirectoryReferenceImpl(string directoryName)
{
return new DesktopDirectoryReference(directoryName);
} protected override IFileReference CreateFileReferenceImpl(string fileName)
{
return new DesktopFileReference(fileName);
}
}
}

DICOM 生成dcm文件的更多相关文章

  1. DICOM:dcm4che工具包怎样压缩dcm文件探讨(续篇)

    背景 前段时间博文DICOM:dcm4che工具包怎样压缩dcm文件探讨(前篇)提到了一个问题:"利用dcm4che工具包中的dcm2dcm来进行dcm文件的压缩和加压缩.即改变dcm文件里 ...

  2. dicom(dcm)文件批量Study Instance UID打包整理工具

    一款可以自动识别原始dicom文件Study Instance UID的工具. 如果你有一堆混乱不堪的dcm文件,这个小工具能帮助你将这些无序的dicom文件按照Study Instance UID压 ...

  3. python .dcm文件读取,并转化为.jpg格式

    .dcm文件是DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信中记录医学图像和相关信息的文件,在用于医学图像处理的时候我们 ...

  4. 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像

    借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...

  5. Android 解析XML文件和生成XML文件

    解析XML文件 public static void initXML(Context context) { //can't create in /data/media/0 because permis ...

  6. SQL*Plus生成html文件

    最近使用SQL*Plus命令生成html文件,遇到一些有意思的知识点,顺便记录一下,方便以后需要的时候而这些知识点又忘记而捉急.好记性不如烂笔头吗! 为什么要用SQL*Plus生成html文件?   ...

  7. vim保存文件时,生成.un~文件

    在用vim保存文件时,文件夹下生成.un~文件 怎么删除这些文件呢 在网上搜索的答案: http://stackoverflow.com/questions/15660669/what-is-a-un ...

  8. WPF根据Oracle数据库的表,生成CS文件小工具

    开发小工具的原因: 1.我们公司的开发是客户端用C#,服务端用Java,前后台在通讯交互的时候,会用到Oracle数据库的字段,因为服务器端有公司总经理开发的一个根据Oracle数据库的表生成的cla ...

  9. 简单生成svg文件

    this.fileSaveSync = function (file, data) { var fs = require('fs-extra'); fs.writeFileSync(file, dat ...

  10. 使用Free Spire.Presentation生成PowerPoint文件

      使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...

随机推荐

  1. 强化学习环境gym/gymnasium下的atari环境的v0、v4、v5的说明

    声明: 本文是最新版gym-0.26.2下Atari环境的安装以及环境版本v0,v4,v5的说明的部分更新和汇总,可以看作是更新和延续版本. 由于gym已经由openai公司独立出来,虽然开发团队和投 ...

  2. 2024ICPC 武汉邀请赛题解 更新至 8 题

    目录 Preface Problem I. 循环苹果串 Problem K. 派对游戏 Problem B. 无数的我 Problem F. 订制服装 Problem E. 回旋镖 Problem D ...

  3. 2023NOIP A层联测25 T2 游戏

    2023NOIP A层联测25 T2 游戏 优秀且新颖的期望题. 思路 分析问题,由于双方都是最优策略,所以可以说学生知道老师会选择那些教室设置概率(概率设置好就不能改变),老师也知道学生会怎样选择教 ...

  4. php 安装使用 seaslog扩展

    这是一个高性能的日志记录扩展,能迅速帮你格式化的写入日志文件. 首先来看安装: sudo pecl install seaslog 一句话搞定,然后更新php.ini配置文件 添加启用以及一部分配置 ...

  5. 扩展 Tomcat Web 服务器的功能

    把服务器提升到新的高度 本教程是所有 Web 服务器或应用服务器管理员的必读指南.尽管 Apache Tomcat 的实现与其他 Web 服务器略有不同,但是本教程为许多高级管理任务提供了一种符合逻辑 ...

  6. golang之context

    context 用来解决 goroutine 之间退出通知.元数据传递的功能. context 使用起来非常方便.源码里对外提供了一个创建根节点 context 的函数: func Backgroun ...

  7. PHP8新特性

    PHP 8.1 提供的功能 枚举 Fiber(纤维) never 返回类型 readonly 属性 final 类常量 新的 array_is_list() 函数 新的 fsync() 和 fdata ...

  8. nginx之常见错误

    在此只介绍源码安装nginx的时候,发生的一些常见的错误 1. nginx访问出现File not found 1) php-fpm找不到SCRIPT_FILENAME中执行的PHP文件 更改配置文件 ...

  9. docker之可视化工具

    Docker UI进行Docker管理(单机) 1.拉取镜像 Docker UI进行Docker管理 2.创建docker容器 docker run -it -d --name docker-web ...

  10. 基于 MongoTemplate 实现MongoDB的复杂查询

    MongoDB是典型的非关系型数据库,但是它的功能越来越复杂,很多项目中,我们为了快速拓展,甚至直接使用Mongo 来替代传统DB做数据持久化.虽然MongoDB在支持具体业务时没有问题,但是由于它是 ...