//public static object GetPageDicomData(DicomDataSet ds)
        //{
        //   MedicalViewerPageInfo output = null;
        //   output = new MedicalViewerPageInfo();

        //   fillOutputWithDicomDataSet(output, ds);
        //   output.Pages = GetPagesPresentationInfo(ds, output, 1);

        //   return output;
        //}



        public static void GetPage(string pdiInstancePath, string pyramidFileName, string sopInstanceUid, object pageInfo)
        {
            MedicalViewerPageInfo output = pageInfo as MedicalViewerPageInfo;

            if (output == null)
            {
                return;
            }

            if (!string.IsNullOrEmpty(pyramidFileName))
            {
                //var cat = PyramidImage.GetCatalouge(pyramidFileName, null);
                //if (cat != null)
                //{
                //   output.TileSize = cat.TileSize;
                //   output.ImageUri = GetImageURI(sopInstanceUid);
                //   {
                //      var res = new List<LeadSize>();
                //      foreach (var r in cat.Resolutions)
                //         res.Add(r);
                //      output.Resolutions = res.ToArray();
                //   }

                //}
            }

            SaveMeta(pdiInstancePath, output);
        }
        static List <MedicalViewerPageInfo> GetPagesInfoFromMaster(DicomDataSet ds, MedicalViewerPageInfo ppiMaster)
        {
            try
            {
                List <MedicalViewerPageInfo> ppiLst = new List <MedicalViewerPageInfo>();

                DicomElement        elemPerFrameFunctionalGroupsSequence = ds.FindFirstElement(null, DicomTag.PerFrameFunctionalGroupsSequence, true);
                List <DicomElement> elemImagePositionPatient             = new List <DicomElement>();
                FindChildElements(ds, elemPerFrameFunctionalGroupsSequence, DicomTag.ImagePositionPatient, elemImagePositionPatient);
                foreach (DicomElement de in elemImagePositionPatient)
                {
                    MedicalViewerPageInfo ppi = new MedicalViewerPageInfo
                    {
                        ImageOrientationPatientArray = ppiMaster.ImageOrientationPatientArray,
                        ImagePositionPatientArray    = ds.GetDoubleValue(de, 0, 3),
                        PixelSpacingPatientArray     = ppiMaster.PixelSpacingPatientArray
                    };
                    Normalize(ppi);
                    ppiLst.Add(ppi);
                }

                return(ppiLst);
            }
            catch
            {
                return(new List <MedicalViewerPageInfo>());
            }
        }
        static MedicalViewerPageInfo[] GetPagesPresentationInfo(DicomDataSet ds, MedicalViewerPageInfo ppiMaster, int DefTotalPages)
        {
            int          nFrames            = DefTotalPages;
            DicomElement elemNumberOfFrames = ds.FindFirstElement(null, DicomTag.NumberOfFrames, true);

            string path = ExtractPDFData(ds);

            if (!string.IsNullOrEmpty(path))
            {
                using (RasterCodecs codecs = new RasterCodecs())
                {
                    using (CodecsImageInfo info = codecs.GetInformation(path, true))
                    {
                        nFrames = info.TotalPages;
                    }
                }
            }
            else
            if (null != elemNumberOfFrames)
            {
                int[] nFramesList = ds.GetIntValue(elemNumberOfFrames, 0, 1);
                nFrames = Math.Max(nFrames, nFramesList[0]);
            }

            List <MedicalViewerPageInfo> PagePresentationInfoLstFromDS = GetPagesInfoFromMaster(ds, ppiMaster);
            List <MedicalViewerPageInfo> PagePresentationInfoLst       = new List <MedicalViewerPageInfo>();

            for (int nIndex = 0; nIndex < nFrames; nIndex++)
            {
                if (nIndex < PagePresentationInfoLstFromDS.Count)
                {
                    PagePresentationInfoLst.Add(PagePresentationInfoLstFromDS[nIndex]);
                }
                else
                {
                    PagePresentationInfoLst.Add(null);
                }
            }

            return(PagePresentationInfoLst.ToArray());
        }
 static void Normalize(MedicalViewerPageInfo presentation)
 {
     if (null != presentation.ImagePositionPatientArray)
     {
         if (presentation.ImagePositionPatientArray.Length == 0)
         {
             presentation.ImagePositionPatientArray = null;
         }
     }
     if (null != presentation.ImageOrientationPatientArray)
     {
         if (presentation.ImageOrientationPatientArray.Length == 0)
         {
             presentation.ImageOrientationPatientArray = null;
         }
     }
     if (null != presentation.PixelSpacingPatientArray)
     {
         if (presentation.PixelSpacingPatientArray.Length == 0)
         {
             presentation.PixelSpacingPatientArray = null;
         }
     }
 }
        static void fillOutputWithDicomDataSet(MedicalViewerPageInfo output, DicomDataSet ds)
        {
            DicomElement elemImagePatientOrientation   = ds.FindFirstElement(null, DicomTag.PatientOrientation, true);
            DicomElement elemImagePositionPatient      = ds.FindFirstElement(null, DicomTag.ImagePositionPatient, true);
            DicomElement elemImageOrientationPatient   = ds.FindFirstElement(null, DicomTag.ImageOrientationPatient, true);
            DicomElement elemImagerPixelSpacing        = ds.FindFirstElement(null, DicomTag.ImagerPixelSpacing, true);
            DicomElement elemPixelSpacing              = ds.FindFirstElement(null, DicomTag.PixelSpacing, true);
            DicomElement elemPhotometricInterpretation = ds.FindFirstElement(null, DicomTag.PhotometricInterpretation, true);


            if (null != elemPhotometricInterpretation)
            {
                string photometricInterpretation = ds.GetStringValue(elemPhotometricInterpretation, 0);
                output.SupportWindowLevel = photometricInterpretation == "MONOCHROME2" || photometricInterpretation == "MONOCHROME1";
            }

            if (null != elemImagePatientOrientation)
            {
                int count = ds.GetElementValueCount(elemImagePatientOrientation);
                if (count > 0)
                {
                    output.PatientOrientation = new string[count];
                    for (int index = 0; index < count; index++)
                    {
                        output.PatientOrientation[index] = ds.GetStringValue(elemImagePatientOrientation, index);
                    }
                }
            }
            if (null != elemImagePositionPatient)
            {
                output.ImagePositionPatientArray = ds.GetDoubleValue(elemImagePositionPatient, 0, 3);
                if (output.ImagePositionPatientArray.Length == 0)
                {
                    output.ImagePositionPatientArray = null;
                }
            }
            if (null != elemImageOrientationPatient)
            {
                output.ImageOrientationPatientArray = ds.GetDoubleValue(elemImageOrientationPatient, 0, 6);
                if (output.ImageOrientationPatientArray.Length == 0)
                {
                    output.ImageOrientationPatientArray = null;
                }
            }
            if (null != elemPixelSpacing)
            {
                output.PixelSpacingPatientArray = ds.GetDoubleValue(elemPixelSpacing, 0, 2);
                if (output.PixelSpacingPatientArray.Length == 0)
                {
                    output.PixelSpacingPatientArray = null;
                }
            }
            else if (null != elemImagerPixelSpacing)
            {
                output.PixelSpacingPatientArray = ds.GetDoubleValue(elemImagerPixelSpacing, 0, 2);
                if (output.PixelSpacingPatientArray.Length == 0)
                {
                    output.PixelSpacingPatientArray = null;
                }
            }
        }