(define (script-fu-sharp-blur img drw image-blur-radius edge-blur-radius edge-detect-amount edge-gamma-correction) (let* ((drawable-width (car (gimp-drawable-width drw))) (drawable-height (car (gimp-drawable-height drw))) (image (car (gimp-image-new drawable-width drawable-height RGB))) (drawable (car (gimp-layer-new image drawable-width drawable-height RGB "Original" 100 NORMAL)))) (gimp-image-undo-disable image) (gimp-selection-all img) (gimp-edit-copy drw) (gimp-floating-sel-anchor (car (gimp-edit-paste drawable FALSE))) (let* ((overlay-layer (car (gimp-layer-copy drawable TRUE))) (mask-layer (car (gimp-layer-copy drawable TRUE)))) (gimp-image-add-layer image drawable 0) (gimp-image-add-layer image overlay-layer 0) (gimp-image-add-layer image mask-layer 0) (if (> edge-blur-radius 0) (plug-in-gauss-iir TRUE img mask-layer edge-blur-radius TRUE TRUE)) (plug-in-edge TRUE img mask-layer edge-detect-amount 1) (let* ((mask-channel (car (gimp-layer-create-mask overlay-layer 0)))) (gimp-image-add-layer-mask image overlay-layer mask-channel) (gimp-edit-copy mask-layer) (gimp-floating-sel-anchor (car (gimp-edit-paste mask-channel FALSE))) (gimp-image-remove-layer image mask-layer) (plug-in-gauss-iir TRUE image drawable image-blur-radius TRUE TRUE) (gimp-levels mask-channel 0 0 255 edge-gamma-correction 0 255) (gimp-image-undo-enable image) (gimp-display-new image) (gimp-displays-flush))))) (script-fu-register "script-fu-sharp-blur" "/Script-Fu/Alchemy/Sharp Blur" "Blur image but retain edges." "Mark Probst (schani@unix.cslab.tuwien.ac.at)" "Mark Probst" "1998/10/11" "RGB RGBA GRAY GRAYA" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-VALUE "Image blur radius" "8" SF-VALUE "Edge blur radius" "4" SF-VALUE "Edge detect amount" "4" SF-VALUE "Edge gamma correction" "2")