C#開發PACS醫學影像處理系統(六):載入Dicom影像
對於一款軟體的擴充套件性和維護性來說,上層業務邏輯和UI表現一定要自己開發才有控制權,否則專案上線之後容易被掣肘,
而底層影象處理,我們不需要重複造輪子,這裡推薦使用fo-dicom,同樣基於Dicom3.0協議。
根據以上原則,後臺影像處理完成之後,即可使用自己開發的控制元件來呈現。
1.先準備好自己的dcm檔案,可以是單個檔案或序列檔案或DicomDir檔案。
2.在VS編輯器裡開啟NUGET搜尋fo-dicoman安裝即可。
3.使用fo-dicom讀取影像。
//將影象處理模式設定為全域性WPF模式 Dicom.Imaging.ImageManager.SetImplementation(Dicom.Imaging.WPFImageManager.Instance); //例項化檔案處理物件並開啟檔案 DicomFile dicomFile = DicomFile.Open(@"C:\101\1.dcm"); //獲取dicom影象物件 DicomImage dicomImage = new DicomImage(dicomFile.Dataset); //不使用LUT dicomImage.UseVOILUT = false; //轉換成一般影象格式,bmp,png等, //在WPF中我們轉換成WriteableBitmap dicomImage.RenderImage().AsWriteableBitmap() :
4.設定縮放比例,通常dcm影像的大小是不固定的,由裝置和技師拍攝手法決定,所以我們要將影象大小縮小或放大到最佳尺寸。
dicomImage物件中的Scale屬性決定了縮放比例,方法引數中Border是邊框容器,也可以使用Grid或其他可以呈現影象的容器。
/// <summary> /// 計算圖片在容器中的縮放比例 /// </summary> /// <param name="dicomImage">圖片</param> /// <param name="imgBoxDock">容器</param> /// <param name="width">實際長度</param> /// <param name="height">實際高度</param> public static void SetImageScale(DicomImage dicomImage, Border imgBoxDock, double width = 0, double height = 0) { double maxWidth = imgBoxDock.Width; double maxHeight = imgBoxDock.Height; if (double.IsNaN(imgBoxDock.Width) || double.IsNaN(imgBoxDock.Height)) { maxWidth = width; maxHeight = height; } dicomImage.Scale = Math.Min(maxWidth / dicomImage.Width, maxHeight / dicomImage.Height); }
5.設定影象對齊方式,影象的長寬一般是不能恰好填充容器的,尤其是設定縮放比例之後,那我們需要在容器中將影象按照一定規則對齊。
/// <summary> /// 在圖片容器中顯示一張圖片 /// </summary> /// <param name="sourceImg">圖片源</param> /// <param name="imgBox">圖片控制元件</param> /// <param name="imgBoxDock">圖片容器</param> /// <param name="align">對齊方式</param> /// <param name="width">實際長度</param> /// <param name="height">實際高度</param> public static void ShowImage(WriteableBitmap sourceImg, InkCanvas imgBox, Border imgBoxDock, ImageAlignment align, double width = 0, double height = 0) { try { if (sourceImg != null) { ImageBrush ib = new ImageBrush(sourceImg); imgBox.Background = ib; } double w = 0; double h = 0; if (double.IsNaN(imgBoxDock.Width) || double.IsNaN(imgBoxDock.Height)) { w = width; h = height; } else { if (sourceImg != null) { w = imgBoxDock.Width - sourceImg.Width; h = imgBoxDock.Height - sourceImg.Height; } else return; } if (align == ImageAlignment.Center) { imgBox.Margin = new Thickness( w / 2, h / 2, w / 2, h / 2); } else if (align == ImageAlignment.Left) { imgBox.Margin = new Thickness( 0, h / 2, w, h / 2); } else if (align == ImageAlignment.Right) { imgBox.Margin = new Thickness( w, h / 2, 0, h / 2); } else if (align == ImageAlignment.Top) { imgBox.Margin = new Thickness( w / 2, 0, w / 2, h); } else if (align == ImageAlignment.Bottom) { imgBox.Margin = new Thickness( w / 2, h, w / 2, 0); } } catch (Exception e) { LogApi.WriteErrLog(e); } }
/// <summary> /// 影象對齊方式 /// </summary> public enum ImageAlignment { /// <summary> /// 居左 /// </summary> Left = 0, /// <summary> /// 置頂 /// </summary> Top = 1, /// <summary> /// 居右 /// </summary> Right = 2, /// <summary> /// 置底 /// </summary> Bottom = 3, /// <summary> /// 居中 /// </summary> Center = 4, /// <summary> /// 跟隨父級(僅用於Cell中dicom容器) /// </summary> Parent = 5, }
最終呈現效果:
注:一些特殊的型別對齊方式是不一樣的,需要對應的掛片協議來控制,詳情請參考本系列文章的掛片協議章節。
例如:鉬靶(modality:MG)型別,是按照居左居右對齊。
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影像處理系統宣傳視訊