C# 实现超声内镜图片转 DICOM 格式实战指南
·
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;
}
更多推荐
所有评论(0)