c# 采集的超声内镜等图片转dicom
1、使用fo-dicom相关dll 使用版本 1.0.38.0
2、图片转dicom样式代码 包含每个图片生成dicom和选中的图片生成key文件

 public static void ImportImage(FileSystemInfo[] fileinfo, string OtherPath, patient patient, List<FileName> imagefile)
    {
        List<ReferencedSOPSequence> referencedSOPs = new List<ReferencedSOPSequence>();
        int leng = fileinfo.Length;
        try
        {
            DateTime dateTime = Convert.ToDateTime(patient.CheckTime);
            for (int i = 0; i < fileinfo.Length; i++)
            {
                FileInfo fi = fileinfo[i] as FileInfo;
                string filename = fi.Name.Replace(".jpg", "").Replace(".bmp", "");
                if (FileHelp.IsFileInUse(fi.FullName))
                {
                    WriteLog.dcmWrite(fi.FullName + "文件在使用中");
                    continue;
                }
                else
                {
                  
                    Bitmap bitmap = new Bitmap(fi.FullName);
                    byte[] pixels = GetPixels(bitmap);
                    int rows, columns;
                    MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);
                    DicomDataset dataset = new DicomDataset();
                    string number = filename;
                    if (number.Contains("-"))
                    {
                        string[] sArray = number.Split('-');
                        int length = sArray.Length;
                        number = sArray[length - 1];
                    }
                    string SOPClassUID = "1.2.840.10008.5.1.4.1.1.2";
                    string SOPInstanceUID = "1.2.840.10008.5.1.4.1.1.2."+ patient.OrgId + "." + patient.AccessionNumber + "." + number;
                    var item = imagefile.Select(o => o.ImageName == filename).ToList();
                    if (item != null)
                    {
                        for (int j = 0; j < item.Count; j++)
                        {
                            if (item[j])
                            {
                                ReferencedSOPSequence referencedSOP = new ReferencedSOPSequence();
                                referencedSOP.ReferencedSOPClassUID = SOPClassUID;
                                referencedSOP.ReferencedSOPInstanceUID = SOPInstanceUID;
                                referencedSOPs.Add(referencedSOP);
                            }
                        }
                    }
                    string PyPatientName= SemiangleHelp.ToDBC(PinYin.GetPinYin(patient.PatientName));
                    dataset.Add(DicomTag.SpecificCharacterSet, "ISO_IR 192");
                    //dataset.Add(DicomTag.SpecificCharacterSet, "GB18030");
                    //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, SOPClassUID);
                    dataset.Add(DicomTag.SOPInstanceUID, SOPInstanceUID);
                    dataset.Add(DicomTag.Modality, patient.Modality);
                    dataset.Add(DicomTag.ImplementationVersionName, "ZH");
                    dataset.Add(DicomTag.PatientName, PyPatientName+patient.PatientName);
                    dataset.Add(DicomTag.OtherPatientNames, patient.PatientName);
                    dataset.Add(DicomTag.PatientID, patient.PatientID);
                    dataset.Add(DicomTag.PatientSex, patient.PatientSex);
                    dataset.Add(DicomTag.PatientBirthDate, patient.PatientBirthDate);
                    dataset.Add(DicomTag.PatientAge, patient.PatientAge.Replace("岁", "Y").Replace("月", "M").Replace("天", "D"));
                    dataset.Add(DicomTag.PatientWeight, String.Empty);
                    dataset.Add(DicomTag.AccessionNumber, patient.AccessionNumber);
                    dataset.Add(DicomTag.StudyID, patient.PatientID);
                    dataset.Add(DicomTag.StudyDescription, patient.BodyPartName);
                    dataset.Add(DicomTag.BodyPartExamined, PinYin.GetPinYinAll(patient.BodyPartName));
                    dataset.Add(DicomTag.StudyDate, dateTime.ToString("yyyyMMdd"));
                    dataset.Add(DicomTag.StudyTime, dateTime.ToString("HHmmss"));
                    dataset.Add(DicomTag.SeriesDate, dateTime.ToString("yyyyMMdd"));
                    dataset.Add(DicomTag.SeriesTime, dateTime.ToString("HHmmss"));
                    dataset.Add(DicomTag.StudyInstanceUID, patient.CheckUUID);
                    dataset.Add(DicomTag.SeriesInstanceUID, patient.CheckUUID);
                    dataset.Add(DicomTag.SeriesNumber, 1);
                    dataset.Add(DicomTag.InstanceNumber, number);
                    dataset.Add(DicomTag.InstitutionName, patient.InstitutionName);//医院名称
                    dataset.Add(DicomTag.AdmissionID, String.Empty);//准许
                    dataset.Add(DicomTag.ReferringPhysicianName, patient.ReferringPhysicianName);//检查医生
                    dataset.Add(DicomTag.AdmittingDiagnosesDescription, String.Empty); //诊断描述
                    dataset.Add(DicomTag.RequestingPhysician, patient.RequestingPhysician); //申请医生
                    dataset.Add(DicomTag.RTImageName, filename);
                    DicomPixelData pixelData = DicomPixelData.Create(dataset, true);
                    pixelData.BitsStored = 8;
                    pixelData.SamplesPerPixel = 3;
                    pixelData.HighBit = 7;
                    pixelData.PhotometricInterpretation = PhotometricInterpretation.Rgb;
                    pixelData.PixelRepresentation = 0;
                    pixelData.PlanarConfiguration = 0;
                    pixelData.AddFrame(buffer);
                    DicomFile dicomfile = new DicomFile(dataset);
                    FileHelp.BluidFile(OtherPath);
                    string filepath = OtherPath + "/ " + filename + ".dcm";
                    if (File.Exists(filepath))
                    {
                        File.Delete(filepath);
                    }
                    dicomfile.Save(filepath);
                    CStore(filepath, patient);
                    bitmap.Dispose();
                }
            }
            KeyImage(leng, OtherPath, patient, referencedSOPs);
        }
        catch(Exception ex)
        {
            WriteLog.dcmWrite("生成dcm异常:" + ex.ToString());
        }
    }

    public static void KeyImage(int leng, string OtherPath, patient patient, List<ReferencedSOPSequence> referencedSOPs)
    {
        try
        {
            if (referencedSOPs.Count > 0)
            {
                //生成ko文件               
                int number = leng + 1;
                DateTime dateTime = Convert.ToDateTime(patient.CheckTime);
                DicomDataset koset = new DicomDataset();
                koset.Add(DicomTag.SpecificCharacterSet, "ISO_IR 192");
                koset.Add(DicomTag.SOPClassUID, "1.2.840.10008.5.1.4.1.1.88.59");
                koset.Add(DicomTag.SOPInstanceUID, "1.2.840.10008.5.1.4.1.1.2." + patient.OrgId + "." + patient.AccessionNumber + "." + number);
                koset.Add(DicomTag.Modality, "KO");
                koset.Add(DicomTag.ImplementationVersionName, "ZH");
                koset.Add(DicomTag.PatientName, patient.PatientName);
                koset.Add(DicomTag.OtherPatientNames, patient.PatientName);
                koset.Add(DicomTag.PatientID, patient.PatientID);
                koset.Add(DicomTag.PatientSex, patient.PatientSex);
                koset.Add(DicomTag.PatientBirthDate, patient.PatientBirthDate);
                koset.Add(DicomTag.PatientAge, patient.PatientAge.Replace("岁", "Y").Replace("月", "M").Replace("天", "D"));
                koset.Add(DicomTag.PatientWeight, String.Empty);
                koset.Add(DicomTag.AccessionNumber, patient.AccessionNumber);
                koset.Add(DicomTag.StudyID, patient.PatientID);
                koset.Add(DicomTag.StudyDescription, patient.BodyPartName);
                koset.Add(DicomTag.BodyPartExamined, PinYin.GetPinYinAll(patient.BodyPartName));
                koset.Add(DicomTag.StudyDate, dateTime.ToString("yyyyMMdd"));
                koset.Add(DicomTag.StudyTime, dateTime.ToString("HHmmss"));
                koset.Add(DicomTag.SeriesDate, dateTime.ToString("yyyyMMdd"));
                koset.Add(DicomTag.SeriesTime, dateTime.ToString("HHmmss"));
                koset.Add(DicomTag.StudyInstanceUID, patient.CheckUUID);
                koset.Add(DicomTag.SeriesInstanceUID, patient.CheckUUID);
                koset.Add(DicomTag.SeriesNumber, 1);
                koset.Add(DicomTag.InstanceNumber, number);
                koset.Add(DicomTag.InstitutionName, patient.InstitutionName);//医院名称
                koset.Add(DicomTag.AdmissionID, String.Empty);//准许
                koset.Add(DicomTag.ReferringPhysicianName, patient.ReferringPhysicianName);//检查医生
                koset.Add(DicomTag.AdmittingDiagnosesDescription, String.Empty); //诊断描述
                koset.Add(DicomTag.RequestingPhysician, patient.RequestingPhysician); //申请医生
                koset.Add(HospitalCode, patient.OrgId); //机构编码 
                DicomDataset StudySequence = new DicomDataset();
                StudySequence.Add(DicomTag.StudyInstanceUID, patient.CheckUUID);
                DicomDataset[] dicomItems = new DicomDataset[referencedSOPs.Count];
                int j = 0;
                foreach (ReferencedSOPSequence referencedSOP in referencedSOPs)         //加入关键序列
                {
                    DicomDataset SeriesSequenceItem = new DicomDataset();
                    SeriesSequenceItem.Add(DicomTag.SeriesInstanceUID, patient.CheckUUID);
                    DicomDataset InstanceSequenceItem = new DicomDataset();
                    InstanceSequenceItem.Add(DicomTag.ReferencedSOPClassUID, referencedSOP.ReferencedSOPClassUID);
                    InstanceSequenceItem.Add(DicomTag.ReferencedSOPInstanceUID, referencedSOP.ReferencedSOPInstanceUID);
                    SeriesSequenceItem.Add(DicomTag.ReferencedSOPSequence, InstanceSequenceItem);
                    dicomItems[j] = SeriesSequenceItem;
                    j++;
                }
                StudySequence.Add(DicomTag.ReferencedSeriesSequence, dicomItems);
                koset.Add(DicomTag.CurrentRequestedProcedureEvidenceSequence, StudySequence);
                koset.Add(DicomTag.ValueType, "CONTAINER");
                koset.Add(DicomTag.ContinuityOfContent, "SEPARATE");
                {
                    // SEQ -(0040,A043) - Concept Name Code Sequence
                    DicomDataset dds = new DicomDataset();
                    dds.Add(DicomTag.CodeValue, "113008");
                    dds.Add(DicomTag.CodingSchemeDesignator, "DCM");
                    dds.Add(DicomTag.CodeMeaning, "For Peer Review");
                    koset.Add(DicomTag.ConceptNameCodeSequence, dds);
                }
                string kofilepath = OtherPath + "/ " + number + ".dcm";
                if (File.Exists(kofilepath))
                {
                    File.Delete(kofilepath);
                }
                DicomFile kodicomfile = new DicomFile(koset);
                kodicomfile.Save(kofilepath);
            }
        }
        catch (Exception ex)
        {
            WriteLog.dcmWrite("KO文件生成异常:" + ex.ToString());
        }
    }

    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;
    }

更多推荐