@@ -666,6 +661,9 @@ const isImageRemoveBgTool = computed(() => category.value === 'image' && action.
@@ -722,6 +720,10 @@ const isImageRemoveBgTool = computed(() => category.value === 'image' && action.
打开目录
+
+
+ 重新处理
+
@@ -813,15 +815,16 @@ const isImageRemoveBgTool = computed(() => category.value === 'image' && action.
}
.action-tab:hover { background: rgba(255, 255, 255, 0.05); color: var(--text-primary); }
.action-tab.active { background: var(--accent-primary); color: #ffffff; border-color: var(--accent-primary); box-shadow: 0 2px 8px rgba(59, 130, 246, 0.3); }
-.tool-body { flex: 1; padding: 24px; overflow-y: auto; }
+.tool-body { flex: 1; padding: 24px; overflow-y: auto; min-height: 0; display: flex; flex-direction: column; }
.tool-main { max-width: 900px; margin: 0 auto; }
.file-drop-zone {
border: 2px dashed var(--glass-border); border-radius: var(--radius-lg);
- padding: 40px; text-align: center; cursor: pointer;
- transition: all var(--transition-normal); margin-bottom: 24px;
+ padding: 80px 40px; text-align: center; cursor: pointer;
+ transition: all var(--transition-normal); margin: auto;
background: var(--glass-bg); backdrop-filter: blur(var(--glass-blur));
-webkit-backdrop-filter: blur(var(--glass-blur));
+ max-width: 600px; width: 100%; flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
}
.file-drop-zone:hover { border-color: var(--accent-primary); background: rgba(59, 130, 246, 0.05); box-shadow: 0 0 20px rgba(59, 130, 246, 0.1); }
.file-drop-zone.has-file { border-style: solid; border-color: var(--glass-border); padding: 12px 16px; }
diff --git a/frontend/src/components/image/ImageBlurTool.vue b/frontend/src/components/image/ImageBlurTool.vue
deleted file mode 100644
index 0ba7de2..0000000
--- a/frontend/src/components/image/ImageBlurTool.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
-
{{ originalWidth }} × {{ originalHeight }} px{{ getFileName() }}
-
-
-
模糊设置
-
模糊半径: {{ blurRadius }}
无模糊最强模糊
-
-
-
{{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageBrightnessTool.vue b/frontend/src/components/image/ImageBrightnessTool.vue
deleted file mode 100644
index 9ff13e7..0000000
--- a/frontend/src/components/image/ImageBrightnessTool.vue
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
-
-
-
-
{{ originalWidth }} × {{ originalHeight }} px{{ getFileName() }}
-
-
-
调整亮度
-
亮度: {{ brightnessVal > 0 ? '+' : '' }}{{ brightnessVal }}
-
对比度: {{ contrastVal > 0 ? '+' : '' }}{{ contrastVal }}
-
饱和度: {{ saturationVal > 0 ? '+' : '' }}{{ saturationVal }}
-
-
-
{{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageCompressTool.vue b/frontend/src/components/image/ImageCompressTool.vue
deleted file mode 100644
index 2f80323..0000000
--- a/frontend/src/components/image/ImageCompressTool.vue
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-
-
-
-
-
-
-
![]()
-
-
-
- {{ originalWidth }} × {{ originalHeight }} px
- {{ getFileName() }}
-
-
-
-
-
-
-
压缩设置
-
-
快速预设
-
-
-
-
-
-
-
质量: {{ qualityInt }}
-
-
最小最大
-
-
-
-
-
-
尺寸 (宽 × 高)
-
-
- ×
-
- px
-
-
-
-
-
-
-
-
- {{ processing ? '处理中...' : '开始压缩' }}
-
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageConvertTool.vue b/frontend/src/components/image/ImageConvertTool.vue
index 3017654..8dd3ccc 100644
--- a/frontend/src/components/image/ImageConvertTool.vue
+++ b/frontend/src/components/image/ImageConvertTool.vue
@@ -27,6 +27,7 @@ const imageFormats = [
const outputFormat = ref('jpeg')
const qualityInt = ref(75)
+const enableCompress = ref(false)
function buildRequest() {
return {
@@ -34,7 +35,9 @@ function buildRequest() {
outputPath: props.outputPath,
format: 'convert',
outputFormat: outputFormat.value,
- qualityInt: outputFormat.value === 'jpeg' ? qualityInt.value : 0,
+ qualityInt: outputFormat.value === 'jpeg'
+ ? (enableCompress.value ? qualityInt.value : 100)
+ : 0,
}
}
function onProcess() { emit('process', buildRequest()) }
@@ -52,6 +55,7 @@ function onDrop(e) { e.preventDefault(); e.currentTarget.classList.remove('drago
+
-
+
+ 启用压缩
+
+
JPEG 质量: {{ qualityInt }}
最小最大
@@ -93,10 +100,12 @@ function onDrop(e) { e.preventDefault(); e.currentTarget.classList.remove('drago
{{ processing ? '处理中...' : '开始处理' }}
+
diff --git a/frontend/src/components/image/ImageEditorTool.vue b/frontend/src/components/image/ImageEditorTool.vue
new file mode 100644
index 0000000..b32cbb9
--- /dev/null
+++ b/frontend/src/components/image/ImageEditorTool.vue
@@ -0,0 +1,612 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
{{ idx + 1 }}
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+
+
+
+
![]()
原图 · {{ fSize(curComp.origSize) }}
+
![]()
{{ compressing ? '压缩中...' : '等待压缩' }}
压缩后 · {{ curComp.compressedSize ? fSize(curComp.compressedSize) : '—' }}
+
+
+
+
+
+
裁剪预览
{{ crW }} × {{ crH }} px
+
+
+
+
+
+
![]()
{{ rsW }} × {{ rsH }}
+
![]()
+
+
✓处理完成{{ fSize(result.origSize) }} → {{ fSize(result.size) }}节省 {{ ((1 - result.size / result.origSize) * 100).toFixed(1) }}%
下载另存为目录
+
+
+
+
+
+
参数设置
+
+
+ 质量: {{ customQ.toFixed(2) }}
+ 共 {{ compressList.length }} 张 · 总计节省 {{ fSize(compTotalOrig - compTotalComp) }}({{ compTotalSaved }}%)
+ 节省 {{ fSize(curComp.origSize - curComp.compressedSize) }}({{ ((1 - curComp.compressedSize / curComp.origSize) * 100).toFixed(1) }}%)增大 {{ fSize(curComp.compressedSize - curComp.origSize) }}({{ ((curComp.compressedSize / curComp.origSize - 1) * 100).toFixed(1) }}%)
+
+
亮度: {{ adjBright > 0 ? '+' : '' }}{{ adjBright }}
对比度: {{ adjContrast > 0 ? '+' : '' }}{{ adjContrast }}
饱和度: {{ adjSat > 0 ? '+' : '' }}{{ adjSat }}
+
锐化强度: {{ sharpAmt }}%
无锐化最强
+
+
灰度强度: {{ grayInt }}%
原图完全灰度
+
+
角度: {{ rotAngle }}°
90°180°270°重置
+
缩放: {{ rsPct }}%
缩小放大
重置 100%
+
+
+
+
+
+
+ {{ processing ? '处理中...' : (action === 'compress' ? (compressList.length > 1 ? `批量下载(${compressList.length} 张)` : '下载压缩图') : action === 'removebg' ? '下载 PNG' : action === 'crop' ? '下载裁剪图' : '导出并保存') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/components/image/ImageGrayscaleTool.vue b/frontend/src/components/image/ImageGrayscaleTool.vue
deleted file mode 100644
index 3963390..0000000
--- a/frontend/src/components/image/ImageGrayscaleTool.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
-
{{ originalWidth }} × {{ originalHeight }} px{{ getFileName() }}
-
-
-
灰度设置
-
灰度强度: {{ grayscaleIntensity }}%
原图完全灰度
-
-
-
{{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageInvertTool.vue b/frontend/src/components/image/ImageInvertTool.vue
deleted file mode 100644
index 83cf2fb..0000000
--- a/frontend/src/components/image/ImageInvertTool.vue
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
-
-
-
-
{{ originalWidth }} × {{ originalHeight }} px{{ getFileName() }}
-
-
-
-
-
{{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageRemoveBgTool.vue b/frontend/src/components/image/ImageRemoveBgTool.vue
deleted file mode 100644
index aec5663..0000000
--- a/frontend/src/components/image/ImageRemoveBgTool.vue
+++ /dev/null
@@ -1,630 +0,0 @@
-
-
-
-
-
-
-
-
![]()
-
-
{{ getFileName() }}
-
{{ imageInfo.width }}×{{ imageInfo.height }} · {{ formatSize(imageInfo.size) }}
-
-
-
-
-
-
-
背景灵敏度: {{ removebgThreshold }}
-
-
-
-
-
-
-
-
-
-
容差
-
-
- {{ bgRemovalTolerance }}
-
-
-
-
-
-
-
快捷
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageResizeTool.vue b/frontend/src/components/image/ImageResizeTool.vue
deleted file mode 100644
index 056d88d..0000000
--- a/frontend/src/components/image/ImageResizeTool.vue
+++ /dev/null
@@ -1,239 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ originalWidth }} × {{ originalHeight }} px
- {{ getFileName() }}
-
-
-
-
-
-
-
调整大小
-
-
-
预设比例
-
-
自由
-
1:1
-
4:3
-
16:9
-
-
-
-
- 尺寸 (宽 × 高)
-
-
-
-
-
-
-
-
- ×
-
- px
-
-
-
- ×
-
- %
-
-
-
-
-
- {{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageRotateTool.vue b/frontend/src/components/image/ImageRotateTool.vue
deleted file mode 100644
index ce299b6..0000000
--- a/frontend/src/components/image/ImageRotateTool.vue
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
-
-
-
-
-
- {{ originalWidth }} × {{ originalHeight }} px
- {{ getFileName() }}
-
-
-
-
-
-
旋转设置
-
-
角度: {{ angleSlider }}°
-
-
0°180°360°
-
-
-
-
-
-
{{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageSharpenTool.vue b/frontend/src/components/image/ImageSharpenTool.vue
deleted file mode 100644
index f4abadb..0000000
--- a/frontend/src/components/image/ImageSharpenTool.vue
+++ /dev/null
@@ -1,77 +0,0 @@
-
-
-
-
-
-
-
-
{{ originalWidth }} × {{ originalHeight }} px{{ getFileName() }}
-
-
-
锐化设置
-
锐化强度: {{ sharpenAmount }}%
无锐化最强锐化
-
-
-
{{ processing ? '处理中...' : '开始处理' }}
-
-
-
-
-
diff --git a/frontend/src/components/image/ImageStitchTool.vue b/frontend/src/components/image/ImageStitchTool.vue
new file mode 100644
index 0000000..dd41f69
--- /dev/null
+++ b/frontend/src/components/image/ImageStitchTool.vue
@@ -0,0 +1,745 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/image/ImageToPdfTool.vue b/frontend/src/components/image/ImageToPdfTool.vue
index 46f6062..3051675 100644
--- a/frontend/src/components/image/ImageToPdfTool.vue
+++ b/frontend/src/components/image/ImageToPdfTool.vue
@@ -43,6 +43,7 @@ function onDrop(e) {
+