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

對於一款軟件的擴展性和維護性來講,上層業務邏輯和UI表現必定要本身開發纔有控制權,不然項目上線以後容易被掣肘,html

而底層圖像處理,咱們不須要重複造輪子,這裏推薦使用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.設置圖像對齊方式,圖像的長寬通常是不能剛好填充容器的,尤爲是設置縮放比例以後,那咱們須要在容器中將圖像按照必定規則對齊。spa

     /// <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,

    }

 

最終呈現效果:code

 

 

 

 

注:一些特殊的類型對齊方式是不同的,須要對應的掛片協議來控制,詳情請參考本系列文章的掛片協議章節。

例如:鉬靶(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醫學影像處理系統(十五):Dicom影像交叉定位線算法

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

C#開發PACS醫學影像處理系統(十七):2D處理之影像旋轉和翻轉

C#開發PACS醫學影像處理系統(十八):Dicom使用LUT色彩加強和反色

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

 

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

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

 

(三)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影像處理系統宣傳視頻

 

 

QQ:1850969244

近10年開發經驗,主攻C#、ASP MVC,HTML5,

B/S C/S 皆可,目前研究醫療領域醫學影像相關技術,

任何技術問題歡迎加QQ交流。

相關文章
相關標籤/搜索