Explorar el Código

fix(v1.18.0->v1.18.1): 修复 Original Size 功能在不同体位间表现不一致的问题

- 重写 setOriginalSize 函数,完全忽略 DICOM spacing
- 改为只基于像素尺寸计算缩放比例,实现像素级 1:1 显示
- 修复了因不同体位 spacing 不同导致的缩放结果差异(spacing=1 时放大,spacing=0.14 时缩小)
- 添加详细的调试日志输出,包括图像尺寸、canvas 尺寸、fitScale 和 finalZoom

改动文件:
- src/pages/view/components/viewers/stack.image.viewer.tsx
- CHANGELOG.md
- package.json
dengdx hace 3 semanas
padre
commit
c1b2c8b1a0
Se han modificado 3 ficheros con 44 adiciones y 21 borrados
  1. 24 0
      CHANGELOG.md
  2. 1 1
      package.json
  3. 19 20
      src/pages/view/components/viewers/stack.image.viewer.tsx

+ 24 - 0
CHANGELOG.md

@@ -2,6 +2,30 @@
 
 本项目的所有重要变更都将记录在此文件中。
 
+## [1.18.1] - 2025-12-22 13:00
+
+### 修复 (Fixed)
+- **Original Size 功能在不同体位间表现不一致问题** ([src/pages/view/components/viewers/stack.image.viewer.tsx](src/pages/view/components/viewers/stack.image.viewer.tsx))
+  - 重写 setOriginalSize 函数,完全忽略 DICOM spacing,实现真正的像素级 1:1 显示
+  - 修复因不同体位 spacing 不同导致的缩放结果差异
+    - 第一个体位 spacing=1 时:zoomFactor=0.278,图像正确放大 ✅
+    - 第二个体位 spacing=0.14 时:zoomFactor=1.987,图像意外缩小 ❌
+  - 改为只基于像素尺寸计算:fitScale = min(canvas宽/图像宽, canvas高/图像高),finalZoom = 1 / fitScale
+  - 添加详细的调试日志输出,包括图像尺寸、canvas 尺寸、fitScale 和 finalZoom
+  - 确保所有体位都能得到一致的像素级 1:1 显示效果
+
+**核心改进:**
+- 缩放算法优化:移除对 spacing 的依赖,简化计算逻辑
+- 一致性保证:不同 spacing 的体位现在都能正确放大到原始尺寸
+- 调试增强:详细的日志输出便于问题排查
+
+**改动文件:**
+- src/pages/view/components/viewers/stack.image.viewer.tsx
+- CHANGELOG.md
+- package.json (版本更新: 1.18.0 -> 1.18.1)
+
+---
+
 ## [1.18.0] - 2025-12-22 11:27
 
 ### 新增 (Added)

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "zsis",
-  "version": "1.18.0",
+  "version": "1.18.1",
   "private": true,
   "description": "医学成像系统",
   "main": "main.js",

+ 19 - 20
src/pages/view/components/viewers/stack.image.viewer.tsx

@@ -732,31 +732,30 @@ export function InvertImage(currentViewportId: string): void {
 export function setOriginalSize(currentViewportId: string) {
   const viewport = cornerstone.getEnabledElementByViewportId(currentViewportId)
     .viewport as cornerstone.StackViewport;
-  // 1) 先正常 fit(或本来就是 fit 状态)
+  
+  // 1) 先reset到fit状态
   viewport.resetCamera();
 
-  // 2) 计算“fit → 1:1”的放大倍数
-  const { dimensions, spacing } = viewport.getImageData();
-  console.log(`dimensions:${dimensions}, spacing:${spacing}`);
+  // 2) 计算像素级1:1需要的zoom(完全忽略spacing!)
+  const { dimensions } = viewport.getImageData();
   const canvas = viewport.canvas;
 
-  // 水平方向 1:1 需要的倍率
-  const cssPixelsPerDicomPx = canvas.clientWidth / (dimensions[0] * spacing[0]);
-  // 垂直方向 1:1 需要的倍率
-  const cssPixelsPerDicomPy =
-    canvas.clientHeight / (dimensions[1] * spacing[1]);
-  // 取两者最小值,保证整张图不会被裁剪
-  const zoomFactor = Math.min(cssPixelsPerDicomPx, cssPixelsPerDicomPy);
-  console.log(`zoomFactor:${zoomFactor}`);
-  console.log(
-    `canvas.clientWidth:${canvas.clientWidth}, dimensions[0]:${dimensions[0]}, spacing[0]:${spacing[0]}`
-  );
-  console.log(
-    `canvas.clientHeight:${canvas.clientHeight}, dimensions[1]:${dimensions[1]}, spacing[1]:${spacing[1]}`
+  // fit状态下,图像缩放到canvas的比例
+  const fitScale = Math.min(
+    canvas.clientWidth / dimensions[0],
+    canvas.clientHeight / dimensions[1]
   );
-  // 3) 直接放大
-  const zoom = viewport.getZoom();
-  viewport.setZoom((zoom * 1) / zoomFactor);
+  
+  // 要达到像素级1:1,需要的zoom = 1 / fitScale
+  const finalZoom = 1 / fitScale;
+  
+  console.log(`[setOriginalSize] Pixel-perfect 1:1 zoom calculation:`);
+  console.log(`  - Image dimensions: ${dimensions[0]}x${dimensions[1]}`);
+  console.log(`  - Canvas size: ${canvas.clientWidth}x${canvas.clientHeight}`);
+  console.log(`  - Fit scale: ${fitScale.toFixed(4)}`);
+  console.log(`  - Final zoom (1:1): ${finalZoom.toFixed(4)}`);
+  
+  viewport.setZoom(finalZoom);
   viewport.render();
 }