C#開發PACS醫學影像處理系統(十六):2D處理之影像平移和縮放
- 2020 年 9 月 18 日
- 筆記
- c#, Dicom, PACS醫學影像, PACS影像處理系統
1.平移,利用WPF中控制項邊距來控制位移:
/// <summary> /// 平移影像 /// </summary> /// <param name="X">平移X軸距離</param> /// <param name="startX">X軸起始位置</param> /// <param name="Y">平移Y軸距離</param> /// <param name="startY">Y軸起始位置</param> /// <param name="isAction">是主動發起還是關聯操作時被動調用</param> internal void MoveImage(double X, double startX, double Y, double startY, bool isAction = true) { GridLine.Margin = new Thickness( GridLine.Margin.Left + X - startX, GridLine.Margin.Top + Y - startY, GridLine.Margin.Right - X + startX, GridLine.Margin.Bottom - Y + startY); if (isAction) { for (int i = 0; i < Cell.MedicalView.SelectedBoxList.Count; i++) { var box = Cell.MedicalView.SelectedBoxList[i]; if (box != this) { box.MoveImage(X, startX, Y, startY, false); } } } //平移所有box for (int i = 0; i < Cell.BoxList.Count; i++) { if (Cell.BoxList[i] != this && (Cell.BoxList[i].ImageAlign == ImageAlignment.Center || Cell.BoxList[i].ImageAlign == ImageAlignment.Parent)) { Cell.BoxList[i].GridLine.Margin = GridLine.Margin; } } }
看效果:
2.影像放大或縮小:
#region -----影像縮放----- //縮放係數 double scaleFactor = 200; //影像按下滑鼠時的縮放x值 double mouseDownScaleX = 1; //影像按下滑鼠時的縮放y值 double mouseDownScaleY = 1; /// <summary> /// 縮放圖片 /// </summary> /// <param name="mouseVal">差值</param> /// <param name="type">滑鼠類型</param> /// <param name="isAction">是主動發起還是關聯操作時被動調用</param> private void ScaleImage(double mouseVal, string type, bool isAction = true) { double stVal = mouseVal / scaleFactor; if (type == "wheel") { mouseVal = mouseVal > 10 ? 10 : mouseVal; mouseVal = mouseVal < -10 ? -10 : mouseVal; stVal = mouseVal / scaleFactor; var st = GetScaleTrans(ToolInkCanvas, 1); if (Math.Abs(st.ScaleX + stVal) > 0.2 && Math.Abs(st.ScaleX + stVal) < 5 && Math.Abs(st.ScaleY + stVal) > 0.2 && Math.Abs(st.ScaleY + stVal) < 5) { SetScaleTrans(ToolInkCanvas, st.ScaleX < 0 ? (st.ScaleX - stVal) : (st.ScaleX + stVal), st.ScaleX < 0 ? (st.ScaleX - stVal) : (st.ScaleX + stVal), false, 1); } } else { stVal = mouseVal / scaleFactor; if (Math.Abs(mouseDownScaleX + stVal) > 0.2 && Math.Abs(mouseDownScaleX + stVal) < 5 && Math.Abs(mouseDownScaleY + stVal) > 0.2 && Math.Abs(mouseDownScaleY + stVal) < 5) { SetScaleTrans(ToolInkCanvas, mouseDownScaleX < 0 ? (mouseDownScaleX - stVal) : (mouseDownScaleX + stVal), mouseDownScaleY < 0 ? (mouseDownScaleY - stVal) : (mouseDownScaleY + stVal), false, 1); } else { isMouseDown = false; } } GetRulerValue(); if (isAction) { for (int i = 0; i < Cell.MedicalView.SelectedBoxList.Count; i++) { var box = Cell.MedicalView.SelectedBoxList[i]; if (box != this) { box.ScaleImage(mouseVal, type, false); } } } //縮放所有box和重新設置比例尺 for (int i = 0; i < Cell.BoxList.Count; i++) { if (Cell.BoxList[i] != this && (Cell.BoxList[i].ImageAlign == ImageAlignment.Center || Cell.BoxList[i].ImageAlign == ImageAlignment.Parent)) { Cell.BoxList[i].SetScaleTrans(Cell.BoxList[i].ToolInkCanvas, mouseDownScaleX < 0 ? (mouseDownScaleX - stVal) : (mouseDownScaleX + stVal), mouseDownScaleY < 0 ? (mouseDownScaleY - stVal) : (mouseDownScaleY + stVal), false, 1); Cell.BoxList[i].GetRulerValue(); } } }
利用XAML設計器中的變換屬性ScaleTransform設置元素縮放比例:
<InkCanvas x:Name="ToolInkCanvas" UseCustomCursor="True" ClipToBounds="False" MinHeight="50" MinWidth="50" EditingMode="None" Background="{x:Null}" Margin="1" > <InkCanvas.RenderTransform> <TransformGroup> <RotateTransform/> <ScaleTransform/> </TransformGroup> </InkCanvas.RenderTransform> </InkCanvas>
/// <summary> /// 設置元素比例 /// </summary> /// <param name="ui">元素</param> /// <param name="scaleX">x比例</param> /// <param name="scaleY">y比例</param> /// <param name="isAppend">是否為追加比例</param> /// <param name="index">變換屬性的下標</param> public ScaleTransform SetScaleTrans(UIElement ui, double scaleX, double scaleY, bool isAppend, int index = 0) { TransformGroup tg = ui.RenderTransform as TransformGroup; var tgnew = tg.CloneCurrentValue(); if (tgnew != null) { ui.RenderTransformOrigin = new Point(0.5, 0.5); ScaleTransform st = tgnew.Children[index] as ScaleTransform; if (isAppend) { st.ScaleX *= scaleX; st.ScaleY *= scaleY; } else { st.ScaleX = scaleX; st.ScaleY = scaleY; } ui.RenderTransform = tgnew; return st; } return null; }
看效果:
C#開發PACS、RIS醫學影像處理系統
目錄整理:
(一)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影像色彩增強(偽彩)
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影像處理系統宣傳影片
![]() |
QQ:1850969244 近10年開發經驗,主攻C#、ASP MVC,HTML5, B/S C/S 皆可,目前研究醫療領域醫學影像相關技術, 任何技術問題歡迎加QQ交流。 |