; 210_photo_halftone.scm ; last modified/tested by Paul Sherman [gimphelp.org] ; Thursday, 07/02/2020 on GIMP 2.10.20 ;================================================== ; ; Installation: ; This script should be placed in the user or system-wide script folder. ; ; Windows 7/10 ; C:\Program Files\GIMP 2\share\gimp\2.0\scripts ; or ; C:\Users\YOUR-NAME\AppData\Roaming\GIMP\2.10\scripts ; ; ; Linux ; /home/yourname/.config/GIMP/2.10/scripts ; or ; Linux system-wide ; /usr/share/gimp/2.0/scripts ; ;================================================== ; ; 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 3 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. ; ; You should have received a copy of the GNU General Public License ; along with this program. If not, see . ; ;============================================================== ; Original information ; ; This script adds a halftone pixel effect to an image based on the steps ; found in this tutorial: http://photoshop-tutorials.deviantart.com/art/Halftone-Pixel-Look-R-31752808 ; Works only on RGB and Indexed images (with and without alpha channels) ; Added new functionality and coding techniques based on suggestions ; of saulgoode and Photocomix at gimptalk.com ;============================================================== (define (210_photo_halftone image layer useVisible dither mode opacity invertHalftone mask invertMask ) (let* ( (isMask nil) (newImage nil) (width nil) (height nil) (originalLayer nil) (theSelection nil) (halftoneLayer nil) (halftoneLayerHolder) (floatingSelection nil) (dither-lut '#(3 0 1 2)) (mode-lut '#( 19 0 1 3 15 4 5 16 17 18 20 21 6 7 8 9 10 11 12 13 14)) (maskCopy nil) ) (gimp-context-push) (gimp-image-undo-group-start image) (define indexed (car (gimp-drawable-is-indexed layer))) (if (= indexed TRUE)(gimp-image-convert-rgb image)) (set! theSelection (car (gimp-selection-save image))) (gimp-selection-none image) (set! isMask (car (gimp-layer-get-mask layer))) (if (<> isMask -1) (gimp-layer-remove-mask layer MASK-APPLY) ) (if (= useVisible TRUE) (set! originalLayer (car (gimp-edit-copy-visible image))) (set! originalLayer (car (gimp-edit-copy layer))) ) (set! newImage (car (gimp-edit-paste-as-new))) (set! originalLayer (car (gimp-image-get-active-layer newImage))) (gimp-layer-add-alpha originalLayer) (gimp-image-convert-indexed newImage (vector-ref dither-lut dither) MONO-PALETTE 0 FALSE TRUE "nil") (gimp-image-convert-rgb newImage) (set! halftoneLayer (car (gimp-edit-copy originalLayer))) (gimp-image-set-active-layer image layer) (set! halftoneLayerHolder (car (gimp-layer-copy layer TRUE))) (gimp-drawable-fill halftoneLayerHolder TRANSPARENT-FILL) (gimp-image-add-layer image halftoneLayerHolder -1) (gimp-drawable-set-name halftoneLayerHolder "Halftone Layer") (set! floatingSelection (car (gimp-edit-paste halftoneLayerHolder TRUE))) (gimp-floating-sel-anchor floatingSelection) (gimp-image-set-active-layer image layer) (if (= mask TRUE) (begin (set! maskCopy (car (gimp-layer-create-mask layer ADD-COPY-MASK))) (gimp-layer-create-mask halftoneLayerHolder ADD-COPY-MASK) (gimp-layer-add-mask halftoneLayerHolder maskCopy) (if (= invertMask TRUE) (gimp-invert maskCopy) ) ) ) (if (= invertHalftone TRUE) (gimp-invert halftoneLayerHolder) ) (gimp-layer-set-mode halftoneLayerHolder (vector-ref mode-lut mode)) (gimp-layer-set-opacity halftoneLayerHolder opacity) (gimp-selection-load theSelection) (gimp-image-delete newImage) (gimp-image-remove-channel image theSelection) (gimp-image-undo-group-end image) (gimp-context-pop) (gimp-displays-flush) ) ; end LET ) ; end DEFINE (script-fu-register "210_photo_halftone" "Halftone" "Add a halftone pixel effect to an image." "Fencepost" "Fencepost" "March 23, 2009" "*" SF-IMAGE "Image" 0 SF-DRAWABLE "Drawable" 0 SF-TOGGLE "Use Visible Layers?" FALSE SF-OPTION "Dithering Option" '("Floyd-Steinberg (Normal)" "Positioned" "None" "Floyd Steinberg (Reduced Color Bleeding)") SF-OPTION "Blend Mode" '( "Softlight Mode" ; 19 "Normal" ; 0 "Dissolve" ; 1 "Multiply" ; 3 "Divide" ; 15 "Screen" ; 4 "Overlay" ; 5 "Dodge" ; 16 "Burn" ; 17 "Hard light" ; 18 "Grain extract" ; 20 "Grain merge" ; 21 "Difference" ; 6 "Addition" ; 7 "Substract" ; 8 "Darken only" ; 9 "Lighten only" ; 10 "Hue" ; 11 "Saturation" ; 12 "Color" ; 13 "Value" ; 14 ) SF-ADJUSTMENT "Opacity of Blend Layer?" '(100.0 0.0 100.0 10 10 1 0) SF-TOGGLE "Invert Halftone Layer?" FALSE SF-TOGGLE "Create Mask From Original Layer?" FALSE SF-TOGGLE "Invert Layer Mask?" FALSE ) (script-fu-menu-register "210_photo_halftone" "/Script-Fu/Photo")