-
Notifications
You must be signed in to change notification settings - Fork 1
/
CarTOONize_02.scm
383 lines (337 loc) · 17.8 KB
/
CarTOONize_02.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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
;***************************************************************************************
; Toon Image script for GIMP 2.6
; Version 1.0.1 - 17-12-2010 added halftone option, check for existence of GREYCstoration
; pop up message only. Filter continues if non-existent.
; Added G'MIC support as per forum request.
; Version 1.0.2 - 17-12-2010 Re-did the Half-tone the same as the comic strip effect
; Copyright (C) 2010 John Harris john@grynn.com>
; Based on comic-book script by Joe Kitella <joe.kitella@gmail.com
; Version 1.0.3 - 17-12-2010 Revised Halftone effect again... Coding problem with layers.
; Version 1.0.4 - 20-12-2010 Added last resort pre-filter of Selective Gaussian Blur as per
; forum request (Rob A>), tightened up the parameters from the request at
; 5/15 to 4/11. There was too much edge loss at the higher values.
; Version 1.0.5 - 21-12-2010 Added SF-OPTION to select the default smoothing type if all filters
; are installed. (Defaults to none installed).
; Version 1.0.6 - 22-12-2010 Added Despeckle smoothing option, ... to display name, and did all edit-
; copy-pastes to a named buffer. Cleaned up code, removed a section that was
; no longer being used. Generates better skin-tone colors than before.
; 24-12-2010 Added Despeckle to filter register information. Changed levels for truer colors.
; Version 1.0.7 - 31-12-2010 Added Level of colors to either flatten out the colors, or make more levels.
; Fixed the active layer display issue when not using halftone. Added option to
; keep image on existing layer (non haltone). Default is keep. Gimp 2.7 fixes.
; Version 1.0.8 - 31-03-2020 Align for use on Gimp 2.10.18
; Version 1.0.9 - 23.09.2021 Align for use on Gimp 2.10.24
; Version 1.0.10 - 06/03/2022 Enhanced line managment and darkening; Use on Gimp 2.10.30
; ---------------------------------------------------------------------------------------
(define (script-fu-CarTOONize
img
drawable
Prefilter
filter-type
line-size
enable-shadow
shadow-intensity
cdepth
new-layer
half-tone
dilate
dilatecount
keepbase
flattenbase
)
(gimp-image-undo-group-start img)
(let* (
(width (car (gimp-drawable-width drawable)))
(height (car (gimp-drawable-height drawable)))
(old-selection (car (gimp-selection-save img)))
(image-type (car (gimp-image-base-type img)))
(buffer (car (gimp-edit-named-copy drawable "temp-buffer")))
(toon-img (car (gimp-edit-named-paste-as-new buffer)))
(layer-temp1 (car (gimp-layer-new toon-img width height 0 "temp1" 100 LAYER-MODE-NORMAL)))
(layer-temp2 (car (gimp-layer-new toon-img width height 0 "temp2" 100 LAYER-MODE-NORMAL)))
(layer-temp3 (car (gimp-layer-new toon-img width height 0 "temp3" 100 LAYER-MODE-NORMAL)))
(layer-temp2a (car (gimp-layer-new toon-img width height 0 "temp2a" 100 LAYER-MODE-NORMAL)))
(layer-temp4 (car (gimp-layer-new toon-img width height 0 "temp4" 100 LAYER-MODE-NORMAL)))
(layer-temp5 (car (gimp-layer-new toon-img width height 0 "temp5" 100 LAYER-MODE-NORMAL)))
(layer-temp6 (car (gimp-layer-new toon-img width height 0 "temp6" 100 LAYER-MODE-NORMAL)))
(layer-temp7 (car (gimp-layer-new toon-img width height 0 "temp7" 100 LAYER-MODE-NORMAL)))
(layer-gmic (car (gimp-layer-new toon-img width height 0 "gmic" 100 LAYER-MODE-NORMAL)))
(layer-cartoonize (car (gimp-layer-new img width height 0 "CarTOONize" 100 LAYER-MODE-NORMAL)))
(layer-comic (car (gimp-layer-new img width height 0 "Comic-strip" 100 LAYER-MODE-NORMAL)))
(cdepth (* 4 cdepth))
(isfiltered FALSE)
(achannel)
(countDil 0) ; dilation counter
)
(gimp-image-undo-disable toon-img)
(if (eqv? (car (gimp-selection-is-empty toon-img)) TRUE)
(gimp-drawable-fill old-selection FILL-WHITE)
)
(gimp-image-insert-layer toon-img layer-gmic 0 -1)
(gimp-image-insert-layer toon-img layer-temp7 0 -1)
(gimp-image-insert-layer toon-img layer-temp6 0 -1)
(gimp-image-insert-layer toon-img layer-temp5 0 -1)
(gimp-image-insert-layer toon-img layer-temp4 0 -1)
(gimp-image-insert-layer toon-img layer-temp3 0 -1)
(if (= enable-shadow TRUE)
(begin
(gimp-image-insert-layer toon-img layer-temp2a 0 -1)
(gimp-layer-set-mode layer-temp2a 3)
)
)
(gimp-image-insert-layer toon-img layer-temp1 0 -1)
(gimp-image-insert-layer toon-img layer-temp2 0 -1)
(gimp-drawable-levels-stretch drawable)
(set! buffer (car (gimp-edit-named-copy drawable "temp-buffer")))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-gmic buffer 0)))
(if (= Prefilter TRUE)
(begin
(if (= filter-type 2)
(begin
;(gimp-message "Filter type = 2")
(if (defined? 'plug-in-gmic-qt)
(begin
;; (plug-in-greycstoration 1 toon-img layer-gmic 60 .70 1 .6 1.1 .8 30 2 0 0 4 10 15 7 1 2)
;; (plug-in-gmic-qt 1 toon-img layer-gmic 1 0 "-cartoon 3.62,221.23,8.7,0.3345,1.788 8")
;(gimp-message "Gmic fx_smooth_haar")
(plug-in-gmic-qt 1 toon-img layer-gmic 1 0 "-fx_smooth_haar 1,10,10,0,0,82")
(set! isfiltered TRUE)
)
(begin
(gimp-message "Gmic must be installed to prefilter, no filter will be applied. obtain from http://Gmic.eu")
)
)
)
)
)
)
(if (= Prefilter TRUE)
(begin
(if (= filter-type 3)
(begin
(if (= isfiltered FALSE)
(begin
(if (defined? 'plug-in-gmic-qt)
(begin
(plug-in-gmic-qt 1 toon-img layer-gmic 1 0 "-fx_smooth_anisotropic 80,.7,1,1.1,1,1.0,30,2,0,1,1,1") ; was 60,.7,1,1.1,1,1,30,2,0,1,1,1,1
(set! isfiltered TRUE)
;(gimp-message "fx_smooth_anisotropic done")
(gimp-displays-flush)
;(gimp-message "quitting")
;(quit)
)
(begin
(gimp-message "G'MIC must be installed to prefilter, no filter will be applied.")
)
)
)
)
)
)
)
)
(if (= Prefilter TRUE)
(begin
(if (= filter-type 0)
(begin
;(gimp-message "Filter type is 0")
(if (= isfiltered FALSE)
(begin
(if (defined? 'plug-in-sel-gauss)
(begin
;(gimp-message "plug-in-sel-gauss go")
(plug-in-sel-gauss 1 toon-img layer-gmic 4 11)
)
)
)
(begin
;(gimp-message "Is filtered is True line 131")
)
)
)
)
)
)
(if (= Prefilter TRUE)
(begin
(if (= filter-type 1)
(begin
(if (= isfiltered FALSE)
(begin
(if (defined? 'plug-in-despeckle)
(begin
;(gimp-message "despeckle")
(plug-in-despeckle 1 toon-img layer-gmic 7 1 -1 256)
)
(begin
(gimp-message "No despeckle installed")
)
)
)
)
)
)
)
)
;(gimp-message "line 186")
(set! buffer (car (gimp-edit-named-copy (car (gimp-image-get-active-layer toon-img)) "temp-buffer")))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp1 buffer 0)))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp3 buffer 0)))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp4 buffer 0)))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp7 buffer 0)))
(if (= enable-shadow TRUE)
(begin
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp2a buffer 0)))
(gimp-drawable-desaturate layer-temp2a DESATURATE-AVERAGE)
(gimp-drawable-threshold layer-temp2a HISTOGRAM-VALUE (/ shadow-intensity 255) 1.0)
)
)
;(gimp-message "line 202")
(gimp-layer-set-mode layer-temp3 15)
(gimp-layer-set-mode layer-temp5 15)
(gimp-layer-set-mode layer-temp4 3)
(gimp-layer-set-mode layer-temp6 3)
(gimp-layer-set-mode layer-temp2 16)
(gimp-displays-flush)
(gimp-drawable-desaturate layer-temp3 DESATURATE-LIGHTNESS)
(set! buffer (car (gimp-edit-named-copy layer-temp1 "temp-buffer")))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp2 buffer 0)))
;(gimp-message "line 216")
(plug-in-gauss 1 toon-img layer-temp2 line-size line-size 0) ; 1)
(gimp-drawable-invert layer-temp2 FALSE) ; was true
; added by karlhof26
(gimp-layer-set-opacity layer-temp2 68)
;(gimp-display-new toon-img)
;(quit)
(gimp-image-merge-down toon-img layer-temp2 0)
(set! layer-temp1 (car (gimp-image-get-active-layer toon-img)))
(gimp-drawable-threshold layer-temp1 HISTOGRAM-VALUE (/ (+ 180 (* line-size 1.5)) 255) 1.0) ; was (/ 245 255) 1.0
;(gimp-drawable-threshold layer-temp1 HISTOGRAM-VALUE (/ 245 255) 1.0) ; was (/ 245 255) 1.0
(if (= dilate TRUE)
(begin
;must invert before dilation
(gimp-drawable-invert layer-temp1 FALSE)
(gimp-selection-all toon-img)
(set! achannel (car (gimp-image-get-active-channel toon-img)))
(while (< countDil dilatecount)
(plug-in-dilate 1 toon-img layer-temp1 1 achannel 0.99 5 0 255)
(set! countDil (+ countDil 1))
)
;(plug-in-dilate 1 toon-img layer-temp1 1 achannel 0.99 10 0 255)
(gimp-selection-none toon-img)
(gimp-drawable-invert layer-temp1 FALSE)
)
)
;(gimp-display-new toon-img)
;(quit)
(gimp-layer-set-mode layer-temp1 LAYER-MODE-MULTIPLY) ;was 3
(gimp-image-merge-down toon-img layer-temp3 0)
(set! layer-temp4 (car (gimp-image-get-active-layer toon-img)))
(set! buffer (car (gimp-edit-named-copy layer-temp4 "temp-buffer")))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp5 buffer 0)))
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-temp6 buffer 0)))
(gimp-drawable-desaturate layer-temp5 DESATURATE-LIGHTNESS)
;(gimp-message "line 267")
(gimp-image-merge-down toon-img layer-temp5 0)
(set! layer-temp4 (car (gimp-image-get-active-layer toon-img)))
(gimp-layer-set-mode layer-temp4 3)
(gimp-displays-flush)
;(gimp-display-new toon-img)
;(quit)
(gimp-image-raise-layer toon-img layer-temp4)
(gimp-image-merge-down toon-img layer-temp4 0)
(set! layer-temp6 (car (gimp-image-get-active-layer toon-img)))
(gimp-layer-set-mode layer-temp6 14)
(gimp-image-merge-down toon-img layer-temp6 0)
(set! layer-temp7 (car (gimp-image-get-active-layer toon-img)))
;(gimp-levels layer-temp7 0 0 255 1 0 225)
(gimp-drawable-levels layer-temp7 HISTOGRAM-VALUE 0.0 1.0 TRUE 1.0 0.0 0.905 TRUE) ; last value was 225
;(gimp-message "line 284")
(if (= flattenbase TRUE)
(gimp-image-flatten toon-img)
)
(gimp-image-convert-indexed toon-img CONVERT-DITHER-NONE CONVERT-PALETTE-GENERATE cdepth FALSE FALSE "x")
(gimp-image-convert-rgb toon-img)
(set! layer-temp1 (car (gimp-image-get-active-layer toon-img)))
(set! buffer (car (gimp-edit-named-copy (car (gimp-image-get-active-drawable toon-img)) "temp-buffer" )))
; These lines here for testing
;(gimp-image-insert-layer img layer-cartoonize 0 -1)
;(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-cartoonize buffer 0 )))
;(gimp-display-new toon-img)
(gimp-displays-flush)
;(quit)
(if (= new-layer TRUE)
(begin
;(gimp-message "new-layer True")
(gimp-image-insert-layer img layer-cartoonize 0 -1)
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-cartoonize buffer 0 )))
(gimp-image-set-active-layer img layer-cartoonize)
)
(begin
;(gimp-message "new-layer False")
(gimp-floating-sel-anchor (car (gimp-edit-named-paste drawable buffer 0 )))
;(gimp-display-new toon-img)
)
)
;(gimp-message "line 318")
(if (= half-tone TRUE)
(begin
;(gimp-message "half-tone start")
;(gimp-message "line 322")
(gimp-image-insert-layer img layer-comic 0 -1)
(gimp-floating-sel-anchor (car (gimp-edit-named-paste layer-comic buffer 0)))
(plug-in-unsharp-mask 1 img layer-comic 4.0 10.0 1)
;(gimp-message "line 326")
(if (defined? 'plug-in-newsprint)
(begin
;(plug-in-newsprint 1 img layer-comic 1 0.3 4 1 0 15 0 75 0 0 0 6)
(plug-in-newsprint 1 img layer-comic 4 1 0 15.0 0 75.0 0 4.0 0 0.0 0 7)
)
(begin
(gimp-message "No newsprint plug in") ;else
)
)
)
)
(gimp-image-undo-enable toon-img)
(if (= keepbase TRUE)
(begin
(gimp-display-new toon-img)
)
(begin
(gimp-image-delete toon-img)
)
)
(gimp-displays-flush)
(gimp-image-undo-group-end img)
(gimp-message "Good finish OK!")
(gc) ; memory garbage cleanup; due to temp image
)
)
; "<Toolbox>/Script-Fu/Artistic/CarTOONize"
(script-fu-register
"script-fu-CarTOONize"
"CarTOONize"
"Toon a Picture. Take a standard RGB or Grayscale picture, and cartoonize it. You can adjust the thickness of the lines, as well as adjust the 'black' shadow intensity. Now you can adjust the color depth, 1 is the flattest, 10 has the most levels. Prefilter option requires and uses the G'MIC Filter, Despeckle or the Selective Gaussian Blur. Set it to FALSE if you don't want noise reduction. Now have the option to keep it on existing layer (non haltone).\n file:CarTOONize_02.scm"
"Joe1GK <kgioj@yahoo.com> KarlH <karlhofmeyr@gmail.com>"
"Joe1GK"
"2010, December"
"RGB* GRAY*"
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-TOGGLE "Prefilter (Noise reduction)" TRUE
SF-OPTION "Filter type - Noise Reduction" '("Selective Gaussian Blur Smoothing" "Despeckle Smoothing" "GMIC Smoothing" "G'MIC Anistropic Smoothing")
SF-ADJUSTMENT "Line Thickness (threshold black areas)" '(10 2 30 1 10 0 1)
SF-TOGGLE "Black Shadows" TRUE
SF-ADJUSTMENT "Shadow Intensity" '(35 0 50 1 10 0 1)
SF-ADJUSTMENT "Color Levels" '(4 1 10 1 10 0 1)
SF-TOGGLE "Generate as new layer" TRUE
SF-TOGGLE "Halftone" TRUE
SF-TOGGLE "Broaden lines?" FALSE
SF-ADJUSTMENT "Broaden line iterations" '(2 1 10 1 2 0 0)
SF-TOGGLE "Keep working image (show 2nd image)" FALSE
SF-TOGGLE "Flatten working image" TRUE
)
(script-fu-menu-register "script-fu-CarTOONize" "<Toolbox>/Script-Fu/Artistic")
(script-fu-menu-register "script-fu-CarTOONize" "<Toolbox>/Script-Fu3/Comics-o-matic")
;end of script