1. 程式人生 > 實用技巧 >C#開發PACS醫學影像處理系統(十):Dicom影像下載策略與演算法

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

C#開發PACS、RIS醫學影像處理系統

目錄整理:

(一)PACS客戶端:

C#開發PACS醫學影像處理系統(一):開發背景和功能預覽

C#開發PACS醫學影像處理系統(二):介面佈局之選單欄

C#開發PACS醫學影像處理系統(三):介面佈局之工具欄

C#開發PACS醫學影像處理系統(四):介面佈局之狀態列

C#開發PACS醫學影像處理系統(五):查詢病人資訊列表

C#開發PACS醫學影像處理系統(六):載入Dicom影像

C#開發PACS醫學影像處理系統(七):讀取影像Dicom資訊

C#開發PACS醫學影像處理系統(八):單元格變換

C#開發PACS醫學影像處理系統(九):序列控制元件與拖拽

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

C#開發PACS醫學影像處理系統(十一):Dicom影像掛片協議

C#開發PACS醫學影像處理系統(十二):繪圖處理之圖形標記

C#開發PACS醫學影像處理系統(十三):繪圖處理之測量工具

C#開發PACS醫學影像處理系統(十四):處理Dicom影像窗寬窗位

C#開發PACS醫學影像處理系統(十五):基於體點陣圖交叉定位線演算法

C#開發PACS醫學影像處理系統(十六):2D處理之平移和縮放

C#開發PACS醫學影像處理系統(十七):2D處理之任意角度旋轉與映象翻轉

C#開發PACS醫學影像處理系統(十八):Dicom影像色彩增強(偽彩)

C#開發PACS醫學影像處理系統(十九):Dicom影像反色處理(負片)

C#開發PACS醫學影像處理系統(二十):Dicom影像放大鏡功能

(二)PACS三維:MRP、MIP、VR

C#開發PACS醫學影像三維重建(一):使用VTK三維重建Dicom影像

(三)PACS網頁端:開發Web版本的PACS

C#開發Web端PACS(一):基於PACS客戶端思想重寫Web端

(四)PACS移動端:開發基於HTML5移動端版本的PACS

C#開發移動端PACS(一):使用HTML5和CSS3開發PACS手機端頁面

C#開發移動端PACS(二):使用 .Net MVC 開發手機端PACS服務端

(五)PACS服務端:

C#開發PACS醫學影像處理系統服務端(一):醫療裝置的連線與收圖

C#開發PACS醫學影像處理系統服務端(二):高併發架構

(六)PACS與RIS系統的通訊與整合

在RIS系統中調起PACS並開啟Dicom影像

(七)雲PACS與遠端會診

C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(一):架構概述

C#開發PACS醫學影像處理系統之雲PACS(區域PACS)(二):遠端會診與雙向轉診

(八)科幻級視訊特效:使用Adobe After Effects 製作PACS影像處理系統宣傳視訊