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 2024-07-08 16:16  反应弧有点长  阅读(38)  评论(0编辑  收藏  举报