C#開發PACS醫學影像處理系統(十):Dicom影像下載策略與算法


1.傳輸協議

當我們PACS客戶端接收到下載命令時需要根據dcm文件的url來下載,這里推薦使用http協議,支持大文件的斷點續傳。

2.下載策略

假設有10個序列,每個序列有100張圖像,

①廣度優先:將任務池中的下載任務平均分配到10個序列,每個序列都同時下載,

優點:是每個序列都能分布加載,當用戶切換序列到單元格時不需要等待。

缺點:當圖像特別多的時候,比如CT薄層,序列切換圖像滾動時顯示不完整。

②深度優先:將任務池中的下載任務根據先進先出原則分配到排序在前的序列,下載完一個后再開始下一個。

優點和缺點恰好和廣度優先策略相反。

 

 

那么魚和熊掌能不能兼得呢?能。

默認使用廣度優先,當用戶點擊某個序列時,一般認為是用戶優先想看的序列,

則為該序列加速,該序列視為特殊加速序列,下載任務排滿,其他序列仍然是平均分配。

 

看效果:

 

 

最后附上http下載的關鍵代碼:

     /// <summary>
        /// 下載文件
        /// </summary>
        /// <param name="url">下載地址</param>
        /// <param name="path">本地路徑</param>
        public static bool DownLoadFile(string url, string path)
        {bool flag = false;
            long SPosition = 0;
            FileStream FStream = null;
            Stream myStream = null;

            try
            {
                //判斷要下載的文件是否存在
                if (File.Exists(path))
                {
                    //打開上次下載的文件
                    FStream = File.OpenWrite(path);
                    //獲取已經下載的長度
                    SPosition = FStream.Length;
                    long serverFileLength = GetHttpLength(url);
                    if (serverFileLength == -1)
                    {
                        //本地文件
                        return true;
                    }
                    if (serverFileLength == 0)
                    {
                        return false;
                    }
                    if (SPosition == serverFileLength)
                    {
                        //文件是完整的,直接結束下載任務
                        return true;
                    }
                    if (SPosition > serverFileLength)
                    {
                        SPosition = 0;
                        FStream.Seek(0, SeekOrigin.Current);
                    }
                    else
                    {
                        FStream.Seek(SPosition, SeekOrigin.Current);
                    }
                }
                else
                {
                    FStream = new FileStream(path, FileMode.Create);
                    SPosition = 0;
                }

                //打開網絡連接
                HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(url);
                if (SPosition > 0)
                {
                    //設置Range值
                    myRequest.AddRange(SPosition);
                }
                //向服務器請求,獲得服務器的回應數據流
                myStream = myRequest.GetResponse().GetResponseStream();
                //定義一個字節數據
                byte[] btContent = new byte[512];
                int intSize = 0;
                intSize = myStream.Read(btContent, 0, 512);
                while (intSize > 0)
                {
                    FStream.Write(btContent, 0, intSize);
                    intSize = myStream.Read(btContent, 0, 512);
                }
                flag = true;
            }
            catch (Exception ex)
            {
                flag = false;
                LogApi.WriteLog("下載文件時異常:" + path);
                LogApi.WriteErrLog(ex);
            }
            finally
            {
                //關閉流
                if (myStream != null)
                {
                    myStream.Close();
                    myStream.Dispose();
                }
                if (FStream != null)
                {
                    FStream.Close();
                    FStream.Dispose();
                }
            }
            return flag;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM