C# jpg格式转dicom格式

安装Nuget包:fo-dicom 5.1.2版本

代码如下:

 /// <summary>
 /// 转换为Dicom格式
 /// </summary>
 /// <param name="patId">患者ID</param>
 /// <param name="pisId">影像唯一号</param>
 /// <param name="textId">访问号</param>
 /// <param name="patName">患者姓名</param>
 /// <param name="inputImagePath">jpg图像路径</param>
 /// <param name="outputDicomPath">dicom输出路径</param>
 /// <returns></returns>
 public static bool ConvertToDicomImages(string patId,string pisId,string textId,string patName, string inputImagePath, string outputDicomPath)
 {
     // 读取图像
     using (var originalImage = new Bitmap(inputImagePath))
     {
         // 创建DICOM数据集
         var dicomDataset = new DicomDataset
         {
              { DicomTag.PatientID, patId },
              { DicomTag.PatientName, patName },
              { DicomTag.StudyInstanceUID, pisId },//StudyUid
              { DicomTag.SeriesInstanceUID, DicomUIDGenerator.GenerateDerivedFromUUID().UID },
              { DicomTag.SOPInstanceUID, DicomUIDGenerator.GenerateDerivedFromUUID().UID },
              { DicomTag.AccessionNumber,textId },//访问号
              { DicomTag.SOPClassUID, DicomUID.SecondaryCaptureImageStorage },
              { DicomTag.PhotometricInterpretation, "RGB" },
              { DicomTag.Rows, (ushort)originalImage.Height },
              { DicomTag.Columns, (ushort)originalImage.Width },
              { DicomTag.SamplesPerPixel, (ushort)3 },
              { DicomTag.BitsAllocated, (ushort)8 },
              { DicomTag.BitsStored, (ushort)8 },
              { DicomTag.HighBit, (ushort)7 }
     };

         // 创建像素数据
         var pixelData = DicomPixelData.Create(dicomDataset, true);
         byte[] imageData = GetImageData(originalImage);
         pixelData.AddFrame(new MemoryByteBuffer(imageData));

         // 创建 DICOM 文件
         var dicomFile = new DicomFile(dicomDataset);

         // 保存 DICOM 文件
         dicomFile.Save(outputDicomPath);

         return File.Exists(outputDicomPath);
     }
 }

 private static byte[] GetImageData(Bitmap image)
 {
     BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
     int actualDataWidth = image.Width * 3; 
     int byteCount = actualDataWidth * image.Height;
     byte[] pixels = new byte[byteCount];
     IntPtr ptr = bitmapData.Scan0;
     for (int y = 0; y < image.Height; y++)
     {
         System.Runtime.InteropServices.Marshal.Copy(ptr + (y * bitmapData.Stride), pixels, y * actualDataWidth, actualDataWidth);
     }
     image.UnlockBits(bitmapData);
     return pixels;
 }

 

posted on   反应弧有点长  阅读(83)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示