在"图像处理"面板(AdvancedProcessingPanel)上添加一个"高级"按钮,点击后打开"滑动参数调节"面板(SliderAdjustmentPanel)。这是一个三级面板,点击返回按钮后会返回到"图像处理"面板。
OperationPanel (二级面板)
└── AdvancedProcessingPanel (图像处理 - 三级面板)
└── SliderAdjustmentPanel (滑动参数调节 - 四级面板)
src/
├── types/
│ └── imageProcessing.ts # 类型定义
├── domain/
│ ├── lutConfig.ts # LUT配置
│ └── processingPresets.ts # 风格预设配置
├── API/
│ └── imageActions.ts # 新增API接口
├── states/
│ ├── panelSwitchSliceForView.ts # 面板切换状态(已修改)
│ ├── store.ts # Redux Store(已修改)
│ └── view/
│ └── sliderAdjustmentPanelSlice.ts # 滑动参数调节面板状态
└── pages/
└── view/
└── components/
├── ParameterSlider.tsx # 参数滑块组件
├── SliderAdjustmentPanel.tsx # 滑动参数调节面板
├── AdvancedProcessingPanel.tsx # 高级处理面板(已修改)
└── OperationPanel.tsx # 操作面板(已修改)
状态:
currentImageId
: 当前图像IDparameters
: 当前参数值selectedStyle
: 当前风格selectedAlgorithm
: 当前算法selectedLUT
: 当前LUTisLoading
: 加载状态isSaving
: 保存状态isInitialLoad
: 初始加载标志error
: 错误信息异步操作:
loadImageProcessingParams
: 加载图像处理参数saveProcessingParams
: 保存图像处理参数同步操作:
setCurrentImageId
: 设置当前图像IDupdateParameter
: 更新单个参数applyPreset
: 应用风格预设resetToPreset
: 重置为当前风格默认值setAlgorithm
: 设置算法setLUT
: 设置LUTclearError
: 清除错误resetState
: 重置状态SliderAdjustmentPanel
面板类型switchToSliderAdjustmentPanel
actionGET /auth/image/{sopInstanceUid}/preparation
获取当前图像处理参数(增益、细节、动态范围、噪声模式)
GET /auth/image/{sopInstanceUid}/proc?contrast=5.0&detail=9.0&latitude=25.0&noise=12.0
获取应用指定参数后的处理后dcm文件(用于实时预览)
URL.createObjectURL(blob)
创建临时URLURL.revokeObjectURL()
释放内存POST /auth/image/{sopInstanceUid}/proc
Body: {
contrast: number, // 增益
detail: number, // 细节
latitude: number, // 动态范围
noise: number // 噪声模式
}
保存图像处理参数到DICOM文件(永久保存)
export const PROCESSING_PRESETS: Record<ProcessingStyle, PresetConfig> = {
'均衡': {
name: '均衡',
params: { contrast: 5.0, detail: 9.0, latitude: 25.0, noise: 12.0, brightness: -2.0, sharpness: 1.0 }
},
'高对比': {
name: '高对比',
params: { contrast: 10.0, detail: 5.0, latitude: 15.0, noise: 8.0, brightness: 0.0, sharpness: 2.0 }
},
// ...
};
export const LUT_OPTIONS: LUTType[] = [
'SIGMOID',
'LINER',
// ...
];
用户在"图像处理"面板
→ 点击"高级"按钮
→ 进入"滑动参数调节"面板
→ 自动加载当前图像的参数
用户拖动滑块或点击加减按钮
→ 参数值实时更新到Redux
→ 触发500ms防抖定时器
→ 调用GET API获取预览dcm(Blob)
→ 创建Blob URL
→ 刷新Viewer显示
用户点击"保存参数"按钮
→ 调用POST API永久保存
→ 成功提示
用户选择不同风格
→ 应用对应的预设参数
→ 立即保存到后端(POST)
用户点击返回按钮
→ 返回到"图像处理"面板
用户拖动滑块
↓
UI组件 (SliderAdjustmentPanel)
↓
Redux Action (updateParameter)
↓
Redux State 更新
↓
防抖处理 (500ms)
↓
API调用 GET /proc (getProcessedDcm)
↓
获取Blob数据
↓
创建Blob URL
↓
更新Viewer显示(TODO)
用户点击"保存参数"
↓
UI组件 (SliderAdjustmentPanel)
↓
Redux Thunk (saveProcessingParams)
↓
API调用 POST /proc (saveImageProcessingParams)
↓
后端永久保存到dcm文件
↓
成功提示
后端参数 (4个): contrast, detail, latitude, noise
前端参数 (2个): brightness, sharpness
问题: 当前代码中sopInstanceUid获取逻辑未实现 解决方案: 需要从ViewerContainer或selectedBodyPosition中获取当前选中图像的ID
问题: 前端参数(brightness, sharpness)与后端参数(contrast, detail等)的同步 解决方案:
问题: 每次预览都创建新的Blob URL,可能导致内存泄漏 解决方案:
问题: 用户快速切换参数可能导致多次API调用 解决方案: 使用500ms防抖机制,合并多次操作为一次请求
已实现:
getProcessedDcm
API - 获取处理后的dcm Blob待实现: