C#開發PACS醫學影像處理系統(十九):Dicom影像放大鏡
在XAML程式碼設計器中,新增canvas畫布與圓形幾何物件,利用VisualBrush筆刷來複制畫面內容到指定容器:
<Canvas x:Name="CvsGlass" Width="106" Height="106" HorizontalAlignment="Left" VerticalAlignment="Top" MouseWheel="CvsGlass_MouseWheel" MouseDown="CvsGlass_MouseDown" MouseUp="CvsGlass_MouseUp" MouseMove="CvsGlass_MouseMove" MouseLeave="CvsGlass_MouseLeave"> <Canvas.RenderTransform> <TransformGroup> <ScaleTransform/> </TransformGroup> </Canvas.RenderTransform> <Canvas Name="magnifierCanvas"> <Ellipse Width="106" Height="106" > <Ellipse.Fill> <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0"> <GradientStop Color="#FFD9D2D2" Offset="1"/> <GradientStop Color="White"/> <GradientStop Color="#FFDFDFDF" Offset="0.244"/> <GradientStop Color="#FF777777" Offset="0.592"/> </LinearGradientBrush> </Ellipse.Fill> </Ellipse> <Ellipse Width="100" Height="100" Canvas.Left="3" Canvas.Top="3" Fill="Black"/> <Ellipse Width="100" Height="100" Name="magnifierEllipse" Canvas.Left="3" Canvas.Top="3"> <Ellipse.Fill> <VisualBrush ViewboxUnits="Absolute" Viewbox="0,0,100,100" ViewportUnits="RelativeToBoundingBox" Viewport="0,0,1,1"/> </Ellipse.Fill> </Ellipse> <TextBlock x:Name="TxtGlassScale" Foreground="Yellow" Visibility="Hidden" FontSize="14" Margin="110,40,0,55" FontFamily="Microsoft YaHei"> <TextBlock.Effect> <DropShadowEffect/> </TextBlock.Effect> </TextBlock> </Canvas> </Canvas>
得到一個類似放大鏡的介面效果:
其中,TxtGlassScale是顯示放大鏡倍數的文字控制元件;
VisualBrush是內容筆刷,看效果:
其中需要注意的是,放大鏡應該是和Box平級,屬於Cell的子控制元件,這樣在影象平鋪模式下則能相容所有影象範圍:
看效果:
參考程式碼:
#region -----放大鏡-----/// <summary> /// 當前大小與vs設計器中的大小的比例 /// </summary> public double ActualScaleVal = 0; /// <summary> /// 放大比例 /// </summary> double glassScale = 2.0; /// <summary> /// 放大鏡檢視範圍寬度 /// </summary> double glassWidth = 0; /// <summary> /// 放大鏡檢視範圍高度 /// </summary> double glassHeight = 0; /// <summary> /// 顯示放大鏡 /// </summary> public void UseGlass() { if (CvsGlass.IsShow()) { CvsGlass.Hide(); return; } if (glassWidth == 0 || glassHeight == 0) { //計算放大鏡比例 100是放大鏡的viewbox的大小 glassWidth = 100 / glassScale; glassHeight = 100 / glassScale; } TxtGlassScale.Foreground = shapeManager.shapeMeasureColor; TxtGlassScale.FontSize = shapeManager.shapeMeasureFontSize; SetGlassViewBox(ActualWidth, ActualHeight, new Point(), true); CvsGlass.Show(); } /// <summary> /// 關閉放大鏡 /// </summary> public void CloseGlass() { CvsGlass.Hide(); } //滾輪控制放比例 private void CvsGlass_MouseWheel(object sender, MouseWheelEventArgs e) { if (e.Delta > 0) { glassScale -= 0.05; } else { glassScale += 0.05; } glassScale = glassScale < 0.1 ? 0.1 : glassScale; glassScale = glassScale > 5 ? 5 : glassScale; glassWidth = 100 / glassScale; glassHeight = 100 / glassScale; Point pos = e.MouseDevice.GetPosition(GridMain); SetGlassViewBox(pos.X, pos.Y, new Point(), false, false); TxtGlassScale.Text = ((glassScale * ActualScaleVal * 2) * 100).ToString("f1") + "%"; TxtGlassScale.Show(); } //是否按下放大鏡滑鼠 bool isGlassDown = false; //記錄按下滑鼠的位置 Point glassPoint = new Point(0, 0); //按下放大鏡 private void CvsGlass_MouseDown(object sender, MouseButtonEventArgs e) { glassPoint.X = e.GetPosition(CvsGlass).X; glassPoint.Y = e.GetPosition(CvsGlass).Y; isGlassDown = true; } //移動放大鏡 private void CvsGlass_MouseMove(object sender, MouseEventArgs e) { if (isGlassDown) { //相對於 GridLine 獲取滑鼠的座標 Point svMainPos = e.MouseDevice.GetPosition(ScrollCell); Point glassPos = e.MouseDevice.GetPosition(CvsGlass); SetGlassViewBox(glassPos.X, glassPos.Y, svMainPos, false); Mouse.Capture(CvsGlass); } } /// <summary> /// 設定放大內容 /// </summary> /// <param name="vbX">寬度引數</param> /// <param name="vbY">高度引數</param> /// <param name="svMainPos">相對於GridLine的座標</param> /// <param name="isInit">是否是初始化</param> /// <param name="reLocation">是否重新定位座標</param> private void SetGlassViewBox(double vbX, double vbY, Point svMainPos, bool isInit = false, bool reLocation = true) { Rect viewBox = GlassVB.Viewbox; double xoffset = viewBox.Width / 2.0; double yoffset = viewBox.Height / 2.0; if (isInit) { viewBox.X = (vbX - xoffset) / 2; viewBox.Y = (vbY - yoffset) / 2; CvsGlass.Margin = new Thickness((vbX - 106) / 2, (vbY - 106) / 2, (vbX - 106) / 2, (vbY - 106) / 2); } else { if (reLocation) { viewBox.X = svMainPos.X - xoffset - (vbX - 106 / 2); viewBox.Y = svMainPos.Y - yoffset - (vbY - 106 / 2); CvsGlass.Margin = new Thickness( CvsGlass.Margin.Left + vbX - glassPoint.X, CvsGlass.Margin.Top + vbY - glassPoint.Y, CvsGlass.Margin.Right - vbX + glassPoint.X, CvsGlass.Margin.Bottom - vbY + glassPoint.Y); } } viewBox.Width = glassWidth; viewBox.Height = glassHeight; GlassVB.Viewbox = viewBox; TxtGlassScale.Hide(); } private void CvsGlass_MouseLeave(object sender, MouseEventArgs e) { isGlassDown = false; } private void CvsGlass_MouseUp(object sender, MouseButtonEventArgs e) { isGlassDown = false; Mouse.Capture(null); } /// <summary> /// 重新設定放大鏡大小和位置 /// </summary> public void ReSetGlass() { if (BoxList.Count == 0) { return; } //*2是因為放大鏡在vs設計器中顯小 放大兩倍 BoxList[0].SetScaleTrans(CvsGlass, ActualScaleVal * 2, ActualScaleVal * 2, false); if (CvsGlass.Margin.Left >= ActualWidth || CvsGlass.Margin.Top >= ActualHeight) { CvsGlass.Margin = new Thickness((ActualWidth - 106) / 2, (ActualHeight - 106) / 2, (ActualWidth - 106) / 2, (ActualHeight - 106) / 2); } } #endregion
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三維重建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影像處理系統宣傳視訊
QQ:1850969244 近10年開發經驗,主攻C#、ASP MVC,HTML5, B/S C/S 皆可,目前研究醫療領域醫學影像相關技術, 任何技術問題歡迎加QQ交流。 |