在XAML代碼設計器中,添加canvas畫布與圓形幾何對象,利用VisualBrush筆刷來複制畫面內容到指定容器:html
<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是顯示放大鏡倍數的文字控件;canvas
VisualBrush是內容筆刷,看效果:微信
其中須要注意的是,放大鏡應該是和Box平級,屬於Cell的子控件,這樣在圖像平鋪模式下則能兼容全部圖像範圍:架構
看效果:併發
參考代碼:app
#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、3D醫學影像處理系統系列教程目錄整理:機器學習
菜鳥入門篇:ide
PACS客戶端:高併發
C#開發PACS醫學影像處理系統(七):讀取影像Dicom信息
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三維處理醫學圖像:
C#開發PACS醫學影像三維重建(一):使用VTK重建3D影像
C#開發PACS醫學影像三維重建(二):使用VTK進行體繪製
C#開發PACS醫學影像三維重建(三):紋理映射與顏色傳輸
C#開發PACS醫學影像三維重建(四):3D網格平滑效果
C#開發PACS醫學影像三維重建(五):基於梯度透明的組織漫遊
C#開發PACS醫學影像三維重建(六):三維光源與陰影效果
C#開發PACS醫學影像三維重建(七):空間測量與標註
C#開發PACS醫學影像三維重建(八):VR體繪製
C#開發PACS醫學影像三維重建(九):MPR三視圖切面重建
C#開發PACS醫學影像三維重建(十):MIP最小密度投影
C#開發PACS醫學影像三維重建(十一):CPR曲面重建
C#開發PACS醫學影像三維重建(十二):VE虛擬內鏡技術
熟手進階篇:
醫學圖像算法:
C#處理醫學圖像(一):基於Hessian矩陣的血管肺紋理骨骼加強對比
C#處理醫學圖像(二):圖像銳化加強對比
PACS網頁端 開發Web版本的PACS:
C#開發Web端PACS(一):基於PACS客戶端思想重寫Web端
C#開發Web端PACS(二):使用 .Net MVC 開發手機端PACS服務端
C#開發Web端PACS(三):使用HTML5和CSS3開發PACS手機端頁面
C#開發Web端PACS(四):Web端與服務端的DICOM傳輸
C#開發Web端PACS(五):Web端的平移縮放旋轉2D操做
C#開發Web端PACS(六):Web端的窗寬窗位調整
C#開發Web端PACS(七):將移動端接入微信公衆號實現醫院雲膠片
登峯造極篇:
C#開發基於Python人工智能的肺結節自動檢測
C#開發基於Python人工智能的脊柱側彎曲率算法
C#開發基於Python機器學習的醫學影像骨骼仿真動畫
C#開發基於Python機器學習的術後恢復模擬
C#開發基於U3D的VR眼鏡設備虛擬人體三維重建
C#開發基於全息投影的裸眼3D醫學影像顯示技術
周邊附加篇:
膠片打印:
C#開發醫學影像膠片打印系統(一):功能與膠片排版
C#開發醫學影像膠片打印系統(二):膠片打印機通信
C#開發醫學影像膠片打印系統(三):不規則排版打印
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交流。 |