Skip to content

Commit 01985e9

Browse files
committed
优化wasm
1 parent c2a1a05 commit 01985e9

File tree

4 files changed

+360
-143
lines changed

4 files changed

+360
-143
lines changed

build-wasm.ps1

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
# ViewStage WASM Build Script
2+
# Automatically compiles the WASM module and copies it to the src directory
3+
4+
param(
5+
[string]$Mode = "release",
6+
[switch]$Help
7+
)
8+
9+
$ErrorActionPreference = "Stop"
10+
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
11+
$WasmDir = Join-Path $ScriptDir "wasm-viewstage"
12+
$OutputDir = Join-Path $ScriptDir "src\wasm"
13+
14+
function Write-Status {
15+
param([string]$Message)
16+
Write-Host "[ViewStage] $Message" -ForegroundColor Cyan
17+
}
18+
19+
function Write-Success {
20+
param([string]$Message)
21+
Write-Host "[ViewStage] $Message" -ForegroundColor Green
22+
}
23+
24+
function Write-Error {
25+
param([string]$Message)
26+
Write-Host "[ViewStage] ERROR: $Message" -ForegroundColor Red
27+
}
28+
29+
if ($Help) {
30+
Write-Host @"
31+
ViewStage WASM Build Script
32+
33+
Usage: .\build-wasm.ps1 [-Mode <mode>] [-Help]
34+
35+
Options:
36+
-Mode Build mode: 'release' (default) or 'dev'
37+
-Help Show this help message
38+
39+
Examples:
40+
.\build-wasm.ps1 # Build in release mode
41+
.\build-wasm.ps1 -Mode dev # Build in development mode
42+
"@
43+
exit 0
44+
}
45+
46+
Write-Status "Starting WASM build process..."
47+
Write-Status "Build mode: $Mode"
48+
49+
# Check if wasm-pack is installed
50+
Write-Status "Checking for wasm-pack..."
51+
$wasmPack = Get-Command wasm-pack -ErrorAction SilentlyContinue
52+
if (-not $wasmPack) {
53+
Write-Error "wasm-pack is not installed!"
54+
Write-Host ""
55+
Write-Host "Please install wasm-pack using one of the following methods:"
56+
Write-Host " 1. cargo install wasm-pack"
57+
Write-Host " 2. Invoke-WebRequest -Uri 'https://rustwasm.github.io/wasm-pack/installer/init.ps1' -OutFile 'install.ps1'; .\install.ps1"
58+
exit 1
59+
}
60+
Write-Success "wasm-pack found: $($wasmPack.Source)"
61+
62+
# Check if the wasm-viewstage directory exists
63+
if (-not (Test-Path $WasmDir)) {
64+
Write-Error "wasm-viewstage directory not found: $WasmDir"
65+
exit 1
66+
}
67+
68+
# Create output directory if it doesn't exist
69+
if (-not (Test-Path $OutputDir)) {
70+
Write-Status "Creating output directory: $OutputDir"
71+
New-Item -ItemType Directory -Path $OutputDir -Force | Out-Null
72+
}
73+
74+
# Build WASM
75+
Write-Status "Building WASM module..."
76+
$buildTarget = if ($Mode -eq "dev") { "dev" } else { "release" }
77+
$buildArgs = @(
78+
"build",
79+
"--target", "web",
80+
"--$buildTarget",
81+
"--out-dir", $OutputDir
82+
)
83+
84+
Push-Location $WasmDir
85+
try {
86+
$startTime = Get-Date
87+
88+
& wasm-pack @buildArgs
89+
90+
if ($LASTEXITCODE -ne 0) {
91+
throw "wasm-pack build failed with exit code $LASTEXITCODE"
92+
}
93+
94+
$endTime = Get-Date
95+
$duration = $endTime - $startTime
96+
97+
Write-Success "WASM build completed in $($duration.TotalSeconds.ToString('F2')) seconds"
98+
}
99+
catch {
100+
Write-Error "Build failed: $_"
101+
Pop-Location
102+
exit 1
103+
}
104+
finally {
105+
Pop-Location
106+
}
107+
108+
# Verify output files
109+
$expectedFiles = @(
110+
"wasm_viewstage.js",
111+
"wasm_viewstage_bg.wasm"
112+
)
113+
114+
$missingFiles = @()
115+
foreach ($file in $expectedFiles) {
116+
$filePath = Join-Path $OutputDir $file
117+
if (-not (Test-Path $filePath)) {
118+
$missingFiles += $file
119+
}
120+
}
121+
122+
if ($missingFiles.Count -gt 0) {
123+
Write-Error "Missing output files: $($missingFiles -join ', ')"
124+
exit 1
125+
}
126+
127+
# Show output file sizes
128+
Write-Status "Output files:"
129+
foreach ($file in $expectedFiles) {
130+
$filePath = Join-Path $OutputDir $file
131+
$fileInfo = Get-Item $filePath
132+
$sizeKB = [math]::Round($fileInfo.Length / 1KB, 2)
133+
Write-Host " - $file ($sizeKB KB)"
134+
}
135+
136+
# Generate TypeScript definitions if needed (optional)
137+
$tsDefPath = Join-Path $OutputDir "wasm_viewstage.d.ts"
138+
if (Test-Path $tsDefPath) {
139+
Write-Status "TypeScript definitions generated"
140+
}
141+
142+
Write-Success "WASM build completed successfully!"
143+
Write-Status "Output directory: $OutputDir"

src-tauri/src/lib.rs

Lines changed: 72 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -175,70 +175,81 @@ fn apply_enhance_filter(img: &DynamicImage, contrast: f32, brightness: f32, satu
175175
enhanced_img.put_pixel(x, y, pixel);
176176
}
177177

178-
// 第二步:锐化处理 (USM 锐化)
178+
// 第二步:锐化处理 (USM 锐化) - 并行优化
179179
if sharpen > 0.0 && width > 2 && height > 2 {
180180
let original = enhanced_img.clone();
181-
let sharpen_amount = sharpen / 100.0; // 0.0 - 1.0
181+
let original_raw = original.as_raw();
182+
let sharpen_amount = sharpen / 100.0;
182183

183-
for y in 1..(height - 1) {
184-
for x in 1..(width - 1) {
185-
let pixel = enhanced_img.get_pixel(x, y);
186-
let r = pixel[0] as f32;
187-
let g = pixel[1] as f32;
188-
let b = pixel[2] as f32;
189-
let a = pixel[3];
190-
191-
// 拉普拉斯锐化核
192-
let neighbors_r: f32 = [
193-
original.get_pixel(x - 1, y - 1)[0],
194-
original.get_pixel(x, y - 1)[0],
195-
original.get_pixel(x + 1, y - 1)[0],
196-
original.get_pixel(x - 1, y)[0],
197-
original.get_pixel(x + 1, y)[0],
198-
original.get_pixel(x - 1, y + 1)[0],
199-
original.get_pixel(x, y + 1)[0],
200-
original.get_pixel(x + 1, y + 1)[0],
201-
].iter().map(|&v| v as f32).sum::<f32>();
202-
203-
let neighbors_g: f32 = [
204-
original.get_pixel(x - 1, y - 1)[1],
205-
original.get_pixel(x, y - 1)[1],
206-
original.get_pixel(x + 1, y - 1)[1],
207-
original.get_pixel(x - 1, y)[1],
208-
original.get_pixel(x + 1, y)[1],
209-
original.get_pixel(x - 1, y + 1)[1],
210-
original.get_pixel(x, y + 1)[1],
211-
original.get_pixel(x + 1, y + 1)[1],
212-
].iter().map(|&v| v as f32).sum::<f32>();
213-
214-
let neighbors_b: f32 = [
215-
original.get_pixel(x - 1, y - 1)[2],
216-
original.get_pixel(x, y - 1)[2],
217-
original.get_pixel(x + 1, y - 1)[2],
218-
original.get_pixel(x - 1, y)[2],
219-
original.get_pixel(x + 1, y)[2],
220-
original.get_pixel(x - 1, y + 1)[2],
221-
original.get_pixel(x, y + 1)[2],
222-
original.get_pixel(x + 1, y + 1)[2],
223-
].iter().map(|&v| v as f32).sum::<f32>();
224-
225-
// 拉普拉斯算子: center * 9 - neighbors
226-
let laplacian_r = r * 9.0 - neighbors_r;
227-
let laplacian_g = g * 9.0 - neighbors_g;
228-
let laplacian_b = b * 9.0 - neighbors_b;
229-
230-
// USM: original + amount * laplacian
231-
let new_r = r + laplacian_r * sharpen_amount;
232-
let new_g = g + laplacian_g * sharpen_amount;
233-
let new_b = b + laplacian_b * sharpen_amount;
234-
235-
enhanced_img.put_pixel(x, y, Rgba([
236-
new_r.clamp(0.0, 255.0) as u8,
237-
new_g.clamp(0.0, 255.0) as u8,
238-
new_b.clamp(0.0, 255.0) as u8,
239-
a
240-
]));
241-
}
184+
let sharpened_pixels: Vec<(u32, u32, Rgba<u8>)> = (1..height - 1)
185+
.into_par_iter()
186+
.flat_map(|y| {
187+
(1..width - 1).into_par_iter().map(move |x| {
188+
let idx = ((y * width + x) * 4) as usize;
189+
190+
let r = original_raw[idx] as f32;
191+
let g = original_raw[idx + 1] as f32;
192+
let b = original_raw[idx + 2] as f32;
193+
let a = original_raw[idx + 3];
194+
195+
let prev_row = ((y - 1) * width) as usize;
196+
let curr_row = (y * width) as usize;
197+
let next_row = ((y + 1) * width) as usize;
198+
let x_offset = (x * 4) as usize;
199+
200+
let neighbors_r: f32 = [
201+
original_raw[prev_row + x_offset - 4],
202+
original_raw[prev_row + x_offset],
203+
original_raw[prev_row + x_offset + 4],
204+
original_raw[curr_row + x_offset - 4],
205+
original_raw[curr_row + x_offset + 4],
206+
original_raw[next_row + x_offset - 4],
207+
original_raw[next_row + x_offset],
208+
original_raw[next_row + x_offset + 4],
209+
].iter().map(|&v| v as f32).sum();
210+
211+
let neighbors_g: f32 = [
212+
original_raw[prev_row + x_offset - 3],
213+
original_raw[prev_row + x_offset + 1],
214+
original_raw[prev_row + x_offset + 5],
215+
original_raw[curr_row + x_offset - 3],
216+
original_raw[curr_row + x_offset + 5],
217+
original_raw[next_row + x_offset - 3],
218+
original_raw[next_row + x_offset + 1],
219+
original_raw[next_row + x_offset + 5],
220+
].iter().map(|&v| v as f32).sum();
221+
222+
let neighbors_b: f32 = [
223+
original_raw[prev_row + x_offset - 2],
224+
original_raw[prev_row + x_offset + 2],
225+
original_raw[prev_row + x_offset + 6],
226+
original_raw[curr_row + x_offset - 2],
227+
original_raw[curr_row + x_offset + 6],
228+
original_raw[next_row + x_offset - 2],
229+
original_raw[next_row + x_offset + 2],
230+
original_raw[next_row + x_offset + 6],
231+
].iter().map(|&v| v as f32).sum();
232+
233+
let laplacian_r = r * 9.0 - neighbors_r;
234+
let laplacian_g = g * 9.0 - neighbors_g;
235+
let laplacian_b = b * 9.0 - neighbors_b;
236+
237+
let new_r = r + laplacian_r * sharpen_amount;
238+
let new_g = g + laplacian_g * sharpen_amount;
239+
let new_b = b + laplacian_b * sharpen_amount;
240+
241+
(x, y, Rgba([
242+
new_r.clamp(0.0, 255.0) as u8,
243+
new_g.clamp(0.0, 255.0) as u8,
244+
new_b.clamp(0.0, 255.0) as u8,
245+
a
246+
]))
247+
})
248+
})
249+
.collect();
250+
251+
for (x, y, pixel) in sharpened_pixels {
252+
enhanced_img.put_pixel(x, y, pixel);
242253
}
243254
}
244255

0 commit comments

Comments
 (0)