-
Notifications
You must be signed in to change notification settings - Fork 1
/
smart-remove.scm
133 lines (115 loc) · 5.02 KB
/
smart-remove.scm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
; Smart Remove
; Smart selection eraser.
; Requires resynthesizer plug-in.
; Paul Harrison ([email protected])
; Versions
; lloyd konneker lkk 3/29/2009 Fix passing workLayerID to plugin.
; Other non-functional changes: comments, error checking, menu item, blurb, license
;
; License:
;
; This program is free software; you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation; either version 2 of the License, or
; (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; The GNU Public License is available at
; http://www.gnu.org/copyleft/gpl.html
; lkk comment: creates stencil selection in a temp dupe image to pass as source drawable to plugin
(define (script-fu-smart-remove img layer corpus-border random-tries-count
comp-size transfer-size invent-gradients max-adjust equal-adjust use-ref-layer ref-layer-id)
(cond
((= 0 (car (gimp-selection-bounds img)))
(gimp-message "To use this script-fu, first select the region you wish to remove.")
)
(#t (let*
(
(dupe (car (gimp-image-duplicate img)))
(channel (car (gimp-selection-save dupe)))
(workLayerID -1) ; lkk
)
; lkk flatten (so stencil gets everything visible) and to activate a layer in dupe
; (gimp-message-set-handler 1) ; debug messages to console
(gimp-image-flatten dupe) ; lkk !!! flatten, activates layer, but deletes alpha
(set! workLayerID (car (gimp-image-get-active-layer dupe)))
(cond ((= -1 workLayerID)
(gimp-message "Failed get active layer")
) )
; lkk plugin requires equal count of channels, target and source. Plugin should be changed to relax this reqt.
(cond ((= 1 (car (gimp-drawable-has-alpha layer)))
;debug (gimp-message "Adding alpha")
(if (not (car (gimp-layer-add-alpha workLayerID))) (gimp-message "Failed add alpha") )
) )
; lkk comment: grow selection, invert, save to channel2, cut a hole size of orig selection
; lkk in the grown selection in channel2, select channel2, un invert
(gimp-selection-grow dupe corpus-border)
(gimp-selection-invert dupe)
(let*
(
(old-background (car (gimp-context-get-background)))
(channel2 (car (gimp-selection-save dupe)))
)
(gimp-selection-load channel)
(gimp-context-set-background '(255 255 255))
(if (not (car (gimp-edit-clear channel2))) (gimp-message "Failed edit clear") )
(gimp-context-set-background old-background)
(gimp-selection-load channel2)
)
(gimp-selection-invert dupe)
; lkk comment: crop the dupe to size of stencil to save memory
(let*
(
(bounds (gimp-selection-bounds dupe))
(x1 (nth 1 bounds))
(y1 (nth 2 bounds))
(x2 (nth 3 bounds))
(y2 (nth 4 bounds))
)
(gimp-image-crop dupe (- x2 x1) (- y2 y1) x1 y1)
)
(gimp-selection-invert dupe) ; lkk !!! plugin requires inverted selection
;(gimp-display-new dupe) ; debug to see the stencil as passed to plugin
;(gimp-displays-flush) ; debug
; lkk originally 7th param was layer (the in layer), which only SEEMED to work. Should be the stencil.
(plug-in-resynthesizer
1
img
layer
workLayerID
random-tries-count ; number of additional tries
comp-size
transfer-size
invent-gradients
max-adjust
equal-adjust
use-ref-layer
ref-layer-id
)
(gimp-image-delete dupe)
(gimp-displays-flush)
) ) ))
(script-fu-register "script-fu-smart-remove"
"<Image>/Filters/Enhance/Heal selection..."
"Extend surrounding texture to cover the selection. Works best with homogenous, not regular surroundings. \
Requires separate resynthesizer plug-in."
"Paul Harrison ([email protected])"
"Copyright 2000 Paul Harrison, 2009 Lloyd Konneker"
"13/9/2000"
"RGB* GRAY*"
SF-IMAGE "Input Image" 0
SF-DRAWABLE "Input Layer" 0
SF-ADJUSTMENT "Radius to take texture from" '(50 7 2000 1.0 1.0 0 1)
SF-ADJUSTMENT "Random search thoroughness" '(20 1 40000 10.0 100.0 0 1)
SF-ADJUSTMENT "Patch size (larger = slower)" '(3 1 50 1.0 2.0 0 1)
SF-ADJUSTMENT "Transfer unit size (smaller = slower, but possibly less artifacts)" '(2 0 30 1.0 2.0 0 1)
SF-TOGGLE "Invent gradients (may greatly help in plain areas without texture)" FALSE
SF-ADJUSTMENT "Max color adjustment applied to transferred patch" '(0 0 255 1.0 2.0 0 1)
SF-TOGGLE "Apply the same amount of adjustment to all channels (expect weird alpha)" FALSE
SF-TOGGLE "Use manually defined reference area" FALSE
SF-DRAWABLE "Reference map layer" 1
)