@@ -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