public static void GetImageInfo(ImageKey key, out ImageTag tag) { if (AppUtil.DbType == AppUtil.DB_YCOM) { YCOM.GetImageInfo(key, out tag); } else { throw new NotImplementedException(); } }
//ImageTagの取得 public static void GetImageTag(string file, out ImageTag tag) { tag = new ImageTag(); using (var dcm = new DicomData(file)) { var dic = DicomTagDictionary.Open(dcm, DcmTag.ToTagArray(DCM.IMAGE_TAG)); tag.InstanceNumber = dic.GetValue <long>(DcmTag.InstanceNumber.Tag, 0); tag.SliceThickness = dic.GetValue <string>(DcmTag.SliceThickness.Tag, ""); tag.ImagePositionPatient = dic.GetValue <string>(DcmTag.ImagePositionPatient.Tag, ""); tag.ImageOrientationPatient = dic.GetValue <string>(DcmTag.ImageOrientationPatient.Tag, ""); tag.SliceLocation = dic.GetValue <string>(DcmTag.SliceLocation.Tag, ""); tag.Rows = dic.GetValue <int>(DcmTag.Rows.Tag, 0); tag.Columns = dic.GetValue <int>(DcmTag.Columns.Tag, 0); tag.PixelSpacing = dic.GetValue <string>(DcmTag.PixelSpacing.Tag, ""); tag.WindowCenter = dic.GetValue <string>(DcmTag.WindowCenter.Tag, ""); tag.WindowWidth = dic.GetValue <string>(DcmTag.WindowWidth.Tag, ""); if (dcm.Images.Load()) { if (dcm.Images.Bits == 8 || dcm.Images.Bits == 24) { tag.WindowCenter = "127"; tag.WindowWidth = "255"; } else { ImageControl ctrl = null; if (dcm.Images.WindowCenters.Length > 0) { tag.WindowCenter = dcm.Images.WindowCenters[0].ToString(); } else { if (ctrl == null) { ctrl = dcm.Images.CreateImageControl(0); } //MinMax if (ctrl != null) { tag.WindowCenter = ctrl.WindowCenter.ToString(); } } if (dcm.Images.WindowWidths.Length > 0) { tag.WindowWidth = dcm.Images.WindowWidths[0].ToString(); } else { if (ctrl == null) { ctrl = dcm.Images.CreateImageControl(0); } //MinMax if (ctrl != null) { tag.WindowWidth = ctrl.WindowWidth.ToString(); } } } tag.NumberOfFrames = dcm.Images.NumberOfFrame; } } }
//画像一覧の取得 public static void GetImageList(LoginItem login, SeriesKey key, out List <ImageTag> imTags, out List <SeriesTag> seTags) { imTags = null; seTags = null; var tags = new List <ImageTag>(); if (key.IsImage) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = key.SOPInstanceUID, StorageID = login.StorageID }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); tags.Add(tag); } else { using (var pc = new PacsComm()) { DicomTagsResult ret = pc.CFindImage(key.StudyInstanceUID, key.SeriesInstanceUID); if (!ret.IsSuccess) { LogUtil.Error("CFINDに失敗しました。"); return; } foreach (var dcmTag in ret.Tags) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = dcmTag.GetTagValue(DicomDic.Find("SOPInstanceUID").Tag), StorageID = login.StorageID }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); Int64.TryParse(dcmTag.GetTagValue(DicomDic.Find("InstanceNumber").Tag), out tag.InstanceNumber); //ソート用 tag.SOPInstanceUID = dcmTag.GetTagValue(DicomDic.Find("SOPInstanceUID").Tag); tags.Add(tag); } } //ソート tags.Sort(new ImageTagComparer()); } //DICOMファイルの取得 int cnt = 0; foreach (var tag in tags) { var imkey = ConvertUtil.Deserialize <ImageKey>(tag.ImageKey); var sto = DbCacheUtil.GetStorage(imkey.StorageID); using (var imp = new Impersonate(sto.LogonUsername, sto.LogonPassword)) { var dcmfile = FileUtil.GetDicomFile(imkey); if (!File.Exists(dcmfile)) { cnt++; } } } if (cnt > 0) { DCM.GetImage(login, key); } int MultiCount = 0; //タグの取得 foreach (var tag in tags) { var imkey = ConvertUtil.Deserialize <ImageKey>(tag.ImageKey); var sto = DbCacheUtil.GetStorage(imkey.StorageID); using (var imp = new Impersonate(sto.LogonUsername, sto.LogonPassword)) { var dcmfile = FileUtil.GetDicomFile(imkey); if (File.Exists(dcmfile)) { ImageTag tmp = null; DicomUtil.GetImageTag(dcmfile, out tmp); tag.InstanceNumber = tmp.InstanceNumber; tag.SliceThickness = tmp.SliceThickness; tag.ImagePositionPatient = tmp.ImagePositionPatient; tag.ImageOrientationPatient = tmp.ImageOrientationPatient; tag.SliceLocation = tmp.SliceLocation; tag.Rows = tmp.Rows; tag.Columns = tmp.Columns; tag.PixelSpacing = tmp.PixelSpacing; tag.WindowCenter = tmp.WindowCenter; tag.WindowWidth = tmp.WindowWidth; tag.NumberOfFrames = tmp.NumberOfFrames; if (tag.IsMultiframe) { MultiCount += 1; } } } } if (key.IsImage) { var sto = DbCacheUtil.GetStorage(key.StorageID); using (var imp = new Impersonate(sto.LogonUsername, sto.LogonPassword)) { var dcmfile = FileUtil.GetDicomFile(key); if (File.Exists(dcmfile)) { imTags = new List <ImageTag>(); ImageTag tmp = tags[0]; if (tmp.IsMultiframe) { for (var i = 0; i < tmp.NumberOfFrames; i++) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = key.SOPInstanceUID, FrameNumber = i, }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); tag.InstanceNumber = i; tag.SliceThickness = tmp.SliceThickness; tag.ImagePositionPatient = tmp.ImagePositionPatient; tag.ImageOrientationPatient = tmp.ImageOrientationPatient; tag.SliceLocation = tmp.SliceLocation; tag.Rows = tmp.Rows; tag.Columns = tmp.Columns; tag.PixelSpacing = tmp.PixelSpacing; tag.WindowCenter = tmp.WindowCenter; tag.WindowWidth = tmp.WindowWidth; tag.NumberOfFrames = tmp.NumberOfFrames; imTags.Add(tag); } } else { imTags.Add(tmp); } } } } else if (MultiCount >= 1) { //マルチフレームがある場合はシリーズで返す seTags = new List <SeriesTag>(); foreach (var tag in tags) { var imkey = ConvertUtil.Deserialize <ImageKey>(tag.ImageKey); var sto = DbCacheUtil.GetStorage(imkey.StorageID); using (var imp = new Impersonate(sto.LogonUsername, sto.LogonPassword)) { var dcmfile = FileUtil.GetDicomFile(imkey); if (File.Exists(dcmfile)) { SeriesTag tmp; DicomUtil.GetSeriesTag(dcmfile, out tmp); var sekey = new SeriesKey() { StudyInstanceUID = imkey.StudyInstanceUID, SeriesInstanceUID = imkey.SeriesInstanceUID, SOPInstanceUID = imkey.SOPInstanceUID, StorageID = login.StorageID, IsImage = true, IsPacsSearch = key.IsPacsSearch }; tmp.SeriesKey = ConvertUtil.Serialize(sekey); seTags.Add(tmp); } } } //ソート seTags = seTags.OrderBy(n => n.SeriesNumber).ToList(); } else { imTags = tags; } }
//画像一覧の取得 public static void GetImageList(SeriesKey key, out List <ImageTag> tags) { tags = new List <ImageTag>(); using (var db = new TryDbConnection(settings)) { if (!key.IsImage) { using (var cmd = db.CreateCommand()) { var sb = new StringBuilder(); sb.Append("SELECT SOPInstanceUID,InstanceNumber,SliceThickness,ImagePositionPatient,ImageOrientationPatient,SliceLocation,Rows,Columns,PixelSpacing,WindowCenter,WindowWidth,StorageID"); sb.Append(" FROM T_Image"); sb.Append(" WHERE StudyInstanceUID=@0 AND SeriesInstanceUID=@1"); cmd.CommandText = sb.ToString(); cmd.Add(key.StudyInstanceUID); cmd.Add(key.SeriesInstanceUID); using (var dr = cmd.ExecuteReader()) { while (dr.Read()) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = (string)dr["SOPInstanceUID"], StorageID = (string)dr["StorageID"] }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); tag.InstanceNumber = (long)dr["InstanceNumber"]; tag.SliceThickness = (string)dr["SliceThickness"]; tag.ImagePositionPatient = (string)dr["ImagePositionPatient"]; tag.ImageOrientationPatient = (string)dr["ImageOrientationPatient"]; tag.SliceLocation = (string)dr["SliceLocation"]; tag.Rows = (int)dr["Rows"]; tag.Columns = (int)dr["Columns"]; tag.PixelSpacing = (string)dr["PixelSpacing"]; tag.WindowCenter = (string)dr["WindowCenter"]; tag.WindowWidth = (string)dr["WindowWidth"]; //ソート用 tag.SOPInstanceUID = (string)dr["SOPInstanceUID"]; tags.Add(tag); } } } //ソート tags.Sort(new ImageTagComparer()); } else { using (var cmd = db.CreateCommand()) { var sb = new StringBuilder(); sb.Append("SELECT NumberOfFrames,SliceThickness,ImagePositionPatient,ImageOrientationPatient,SliceLocation,Rows,Columns,PixelSpacing,WindowCenter,WindowWidth,StorageID"); sb.Append(" FROM T_Image"); sb.Append(" WHERE StudyInstanceUID=@0 AND SeriesInstanceUID=@1 AND SOPInstanceUID=@2"); cmd.CommandText = sb.ToString(); cmd.Add(key.StudyInstanceUID); cmd.Add(key.SeriesInstanceUID); cmd.Add(key.SOPInstanceUID); using (var dr = cmd.ExecuteReader()) { if (dr.Read()) { int frames = (int)dr["NumberOfFrames"]; for (int i = 0; i < frames; i++) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = key.SOPInstanceUID, FrameNumber = i, StorageID = (string)dr["StorageID"] }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); tag.InstanceNumber = i; tag.SliceThickness = (string)dr["SliceThickness"]; tag.ImagePositionPatient = (string)dr["ImagePositionPatient"]; tag.ImageOrientationPatient = (string)dr["ImageOrientationPatient"]; tag.SliceLocation = (string)dr["SliceLocation"]; tag.Rows = (int)dr["Rows"]; tag.Columns = (int)dr["Columns"]; tag.PixelSpacing = (string)dr["PixelSpacing"]; tag.WindowCenter = (string)dr["WindowCenter"]; tag.WindowWidth = (string)dr["WindowWidth"]; tag.NumberOfFrames = frames; tags.Add(tag); } } } } } } }
//画像一覧の取得 public static void GetImageList(SeriesKey key, out List <ImageTag> tags) { tags = new List <ImageTag>(); if (!key.IsImage) { var imageQuery = new RBObjectQuery(); imageQuery.is_filter_on = 1; imageQuery.location = Int32.Parse(key.StorageID); imageQuery.StudyUID = key.StudyInstanceUID; imageQuery.SeriesUID = key.SeriesInstanceUID; List <RBImage> imageList; if (!GetImageList(imageQuery, out imageList)) { return; } //ソート imageList.Sort((x, y) => { int c = x.ImageNo.CompareTo(y.ImageNo); if (c == 0) { return(x.InstUID.CompareTo(y.InstUID)); } else { return(c); } }); foreach (var image in imageList) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = image.InstUID, StorageID = key.StorageID }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); //new RsImageKey(key, image.InstUID); tag.InstanceNumber = image.ImageNo; tag.SliceThickness = image.SliceThickness.ToString(); tag.ImagePositionPatient = image.ImagePosition.ToString('\\'); tag.ImageOrientationPatient = image.ImageOrientation.ToString('\\'); tag.SliceLocation = image.SliceLocation.ToString(); tag.Rows = image.Rows; tag.Columns = image.Columns; tag.PixelSpacing = image.PixelSpacing.ToString('\\'); tag.WindowCenter = image.Level.ToString('\\'); tag.WindowWidth = image.Width.ToString('\\'); tags.Add(tag); } } else { //※イメージで検索できない var imageQuery = new RBObjectQuery(); imageQuery.is_filter_on = 1; imageQuery.location = Int32.Parse(key.StorageID); imageQuery.StudyUID = key.StudyInstanceUID; imageQuery.SeriesUID = key.SeriesInstanceUID; List <RBImage> imageList; if (!GetImageList(imageQuery, out imageList)) { return; } foreach (var image in imageList) { if (image.InstUID == key.SOPInstanceUID) { var nof = image.NoOfFrames; if (nof == 0) { nof = 1; } for (int i = 0; i < nof; i++) { var imkey = new ImageKey() { StudyInstanceUID = key.StudyInstanceUID, SeriesInstanceUID = key.SeriesInstanceUID, SOPInstanceUID = image.InstUID, FrameNumber = i, StorageID = key.StorageID }; var tag = new ImageTag(); tag.ImageKey = ConvertUtil.Serialize(imkey); //new RsImageKey(key, i); tag.InstanceNumber = i; tag.SliceThickness = image.SliceThickness.ToString(); tag.ImagePositionPatient = image.ImagePosition.ToString('\\'); tag.ImageOrientationPatient = image.ImageOrientation.ToString('\\'); tag.SliceLocation = image.SliceLocation.ToString(); tag.Rows = image.Rows; tag.Columns = image.Columns; tag.PixelSpacing = image.PixelSpacing.ToString('\\'); tag.WindowCenter = image.Level.ToString('\\'); tag.WindowWidth = image.Width.ToString('\\'); tag.NumberOfFrames = nof; tags.Add(tag); } break; } } } }