From 1cb1f9bafb478de275afefae9d7f94d441650a84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemys=C5=82aw?= Date: Fri, 24 Apr 2026 21:57:17 +0200 Subject: 2.260424-0:przem-hitchcock-d400-film-effect.scm --- script-fu/3.0/przem-hitchcock-d400-film-effect.scm | 236 +++++++++++++++++++++ script-fu/3.0/przem-wet-collodion-v3.scm | 8 +- script-fu/changelog.md | 5 +- 3 files changed, 244 insertions(+), 5 deletions(-) create mode 100644 script-fu/3.0/przem-hitchcock-d400-film-effect.scm diff --git a/script-fu/3.0/przem-hitchcock-d400-film-effect.scm b/script-fu/3.0/przem-hitchcock-d400-film-effect.scm new file mode 100644 index 0000000..c14c36c --- /dev/null +++ b/script-fu/3.0/przem-hitchcock-d400-film-effect.scm @@ -0,0 +1,236 @@ +; Hitchcock D400 Film Effect – imitacja chińskiego filmu Hitchock D400 +; author: PRP +; licencja: Public Domain +; Gdańsk - 24-04-2026 +; ver. 2.260424-0 + + +(define (add-hsv-noise img drawable intensity-h intensity-s intensity-v grain) + (let* ( + (width (car (gimp-image-get-width img))) + (height (car (gimp-image-get-height img))) + (noise-layer (car (gimp-layer-new img "Noise" width height RGB-IMAGE 100 LAYER-MODE-NORMAL))) + ) + + ; Konwertuj do HSV jeśli to konieczne + ;(if (not (= (car (gimp-drawable-is-rgb drawable)) 1)) + ; (gimp-image-convert-rgb img)) + (gimp-context-set-foreground '(128 128 128)) + (gimp-context-set-background '(0 0 0)) + (gimp-image-insert-layer img noise-layer 0 -1) + (gimp-drawable-fill noise-layer FILL-TRANSPARENT) + + ; Generuj szum + ;(plug-in-solid-noise RUN-NONINTERACTIVE img noise-layer 0 0 (random 1000) 0 4 4) + (let* ((noise-width (cadddr (gimp-drawable-mask-intersect drawable))) + (noise-height (caddr (cddr (gimp-drawable-mask-intersect drawable))))) + + (gimp-drawable-merge-new-filter noise-layer "gegl:noise-solid" 0 LAYER-MODE-REPLACE 1.0 "tileable" FALSE "turbulent" FALSE "seed" 0 + "detail" grain "x-size" grain "y-size" grain + "width" noise-width "height"noise-height)) + + ; Ustaw odpowiednie intensywności dla każdego kanału HSV + (let* ( + (h-channel (car (gimp-layer-new img "H Channel" width height RGB-IMAGE 100 LAYER-MODE-HSV-HUE))) + (s-channel (car (gimp-layer-new img "S Channel" width height RGB-IMAGE 100 LAYER-MODE-HSV-SATURATION))) + (v-channel (car (gimp-layer-new img "V Channel" width height RGB-IMAGE 100 LAYER-MODE-HSV-VALUE)))) + + ; Dodaj kanały + (gimp-image-insert-layer img h-channel 0 -1) + (gimp-image-insert-layer img s-channel 0 -1) + (gimp-image-insert-layer img v-channel 0 -1) + + ; Skopiuj szum do każdego kanału + (gimp-edit-copy (vector noise-layer)) + ; czy to potrzebne ? + (gimp-edit-copy (vector drawable)) + (let* ( + (pasted (car (gimp-edit-paste h-channel TRUE))) + (num-pasted (vector-length pasted)) + (floating-sel (vector-ref pasted (- num-pasted 1))) + ) + (gimp-layer-set-offsets floating-sel 0 0) + (gimp-floating-sel-anchor floating-sel)) + + (gimp-edit-copy (vector drawable)) + (let* ( + (pasted (car (gimp-edit-paste s-channel TRUE))) + (num-pasted (vector-length pasted)) + (floating-sel (vector-ref pasted (- num-pasted 1))) + ) + (gimp-layer-set-offsets floating-sel 0 0) + (gimp-floating-sel-anchor floating-sel)) + + + (gimp-edit-copy (vector drawable)) + (let* ( + (pasted (car (gimp-edit-paste v-channel TRUE))) + (num-pasted (vector-length pasted)) + (floating-sel (vector-ref pasted (- num-pasted 1))) + ) + (gimp-layer-set-offsets floating-sel 0 0) + (gimp-floating-sel-anchor floating-sel)) + + (gimp-layer-set-opacity noise-layer 70) + + ; Ustaw przezroczystość dla każdego kanału + (gimp-layer-set-opacity h-channel intensity-h) + (gimp-layer-set-opacity s-channel intensity-s) + (gimp-layer-set-opacity v-channel intensity-v) + + ; Połącz kanały z oryginalnym obrazem + (gimp-image-merge-down img h-channel EXPAND-AS-NECESSARY) + (gimp-image-merge-down img s-channel EXPAND-AS-NECESSARY) + (gimp-image-merge-down img v-channel EXPAND-AS-NECESSARY) + + ;(gimp-image-merge-down img noise-layer EXPAND-AS-NECESSARY) + + + + ) + ;(gimp-image-remove-layer img noise-layer) + ) +) + + + + + +(define (przem-hitchcock-d400-film-effect image drawable) + (let* ( + (film-grain-layer (vector-ref drawable 0)) + (width (car (gimp-image-get-width image))) + (height (car (gimp-image-get-height image))) + (vignette-layer) + (color-grade-layer) + (original-drawable drawable) + ) + ;; Start undo group + (gimp-image-undo-group-start image) + + ;; --------------------------------------------------------- + ;; 1. WARSTWA ZIARNA KLISZY (Film Grain) + ;; --------------------------------------------------------- + ;(set! film-grain-layer (car (gimp-layer-new image "Film Grain" width height RGB-IMAGE 50 LAYER-MODE-NORMAL))) + ;(gimp-image-insert-layer image film-grain-layer 0 -1) + ;(gimp-context-set-foreground '(128 128 128)) + ;(gimp-context-set-background '(0 0 0)) + ;(gimp-drawable-fill film-grain-layer FILL-BACKGROUND) + ;(plug-in-hsv-noise RUN-NONINTERACTIVE image film-grain-layer 0 0 0 45) + (add-hsv-noise image film-grain-layer 35 40 50 0.45) + + ; (plug-in-gauss-iir RUN-NONINTERACTIVE image film-grain-layer 0.8 1 1) + (gimp-drawable-merge-new-filter film-grain-layer "gegl:gaussian-blur" 0 LAYER-MODE-REPLACE 0.8 "std-dev-x" 1 "std-dev-y" 1 "filter" "iir") + + (gimp-layer-set-mode film-grain-layer LAYER-MODE-MULTIPLY) + + ;; --------------------------------------------------------- + ;; 2. WARSTWA WINIETOWANIA (Vignette) + ;; --------------------------------------------------------- + ;(set! vignette-layer (car (gimp-layer-new image width height RGBA-IMAGE "Vignette" 100 NORMAL-MODE))) + ;(gimp-image-insert-layer image vignette-layer 0 -1) + ;(gimp-drawable-fill vignette-layer TRANSPARENT-FILL) + ;(let* ( + ; (selection (car (gimp-selection-ellipse image (/ width 4) (/ height 4) (/ width 2) (/ height 2) 0 0 0))) + ; (sel-bounds) + ; ) + ; (gimp-selection-invert image) + ; (gimp-context-set-foreground '(0 0 0)) + ; (gimp-edit-fill vignette-layer FOREGROUND-FILL) + ; (gimp-selection-none image) + ; (plug-in-gauss-iir RUN-NONINTERACTIVE image vignette-layer 40 1 1) + ; ) + ; (gimp-layer-set-mode vignette-layer MULTIPLY-MODE) + ; (gimp-layer-set-opacity vignette-layer 60) + + ;; --------------------------------------------------------- + ;; 3. WARSTWA KORYGUJĄCA KOLORY (Color Grading D400) + ;; --------------------------------------------------------- + ; (set! color-grade-layer (car (gimp-layer-new image width height RGBA-IMAGE "Color Grade D400" 100 NORMAL-MODE))) + ; (gimp-image-insert-layer image color-grade-layer 0 -1) + ; (gimp-drawable-fill color-grade-layer TRANSPARENT-FILL) + + ;; Cienie – lekko zielonkawe (charakterystyczne dla D400) + ; (gimp-context-set-foreground '(40 70 50)) + ; (gimp-edit-fill color-grade-layer FOREGROUND-FILL) + ; (gimp-layer-set-mode color-grade-layer COLOR-MODE) + ; (gimp-layer-set-opacity color-grade-layer 35) + + ;; Światła – ciepłe, kremowe + ; (let* ((warm-lights (car (gimp-layer-new image width height RGBA-IMAGE "Warm Lights" 100 NORMAL-MODE)))) + ; (gimp-image-insert-layer image warm-lights 0 -1) + ; (gimp-drawable-fill warm-lights TRANSPARENT-FILL) + ; (gimp-context-set-foreground '(255 240 220)) + ; (gimp-edit-fill warm-lights FOREGROUND-FILL) + ; (gimp-layer-set-mode warm-lights SOFTLIGHT-MODE) + ; (gimp-layer-set-opacity warm-lights 25) + ;) + + ;; --------------------------------------------------------- + ;; 4. REDUKCJA SATURACJI (Desaturation) + ;; --------------------------------------------------------- + ; (plug-in-colors-hue-sat RUN-NONINTERACTIVE image drawable 0 0 -20 0) + + ;; --------------------------------------------------------- + ;; 5. DELIKATNY SOFT-FOCUS (Symulacja starego obiektywu) + ;; --------------------------------------------------------- + ; (let* ((soft-copy (car (gimp-layer-copy drawable TRUE)))) + ; (gimp-image-insert-layer image soft-copy 0 -1) + ; (plug-in-gauss-iir RUN-NONINTERACTIVE image soft-copy 1.2 1 1) + ; (gimp-layer-set-mode soft-copy SCREEN-MODE) + ; (gimp-layer-set-opacity soft-copy 15) + ; ) + + ;; --------------------------------------------------------- + ;; 6. LEKKA WINIETA KOLOROWA (Chromatic Vignette) + ;; --------------------------------------------------------- + ;(let* ((chrom-vignette (car (gimp-layer-new image width height RGBA-IMAGE "Chromatic Vignette" 100 NORMAL-MODE)))) + ; (gimp-image-insert-layer image chrom-vignette 0 -1) + ; (gimp-drawable-fill chrom-vignette TRANSPARENT-FILL) + ; (gimp-context-set-foreground '(0 0 0)) + ; (gimp-edit-fill chrom-vignette FOREGROUND-FILL) + ; (gimp-layer-set-mask chrom-vignette (car (gimp-layer-create-mask chrom-vignette ADD-WHITE-TO-SELECTION))) + ; (gimp-layer-set-mode chrom-vignette MULTIPLY-MODE) + ; (gimp-layer-set-opacity chrom-vignette 20) + ; ) + + ;; --------------------------------------------------------- + ;; 7. DODATKOWE ZIARNO W CIENIACH (Shadow Grain Boost) + ;; --------------------------------------------------------- + ; (let* ((shadow-grain (car (gimp-layer-new image width height RGBA-IMAGE "Shadow Grain" 100 NORMAL-MODE)))) + ; (gimp-image-insert-layer image shadow-grain 0 -1) + ; (gimp-drawable-fill shadow-grain TRANSPARENT-FILL) + ; (gimp-context-set-foreground '(30 30 30)) + ; (gimp-edit-fill shadow-grain FOREGROUND-FILL) + ; (plug-in-hsv-noise RUN-NONINTERACTIVE image shadow-grain 0 0 0 60) + ; (gimp-layer-set-mode shadow-grain MULTIPLY-MODE) + ; (gimp-layer-set-opacity shadow-grain 25) + ; ) + + ;; Flatten image (opcjonalnie – można zostawić warstwy) + ;; (gimp-image-flatten image) + + ;; End undo group + (gimp-image-undo-group-end image) + (gimp-displays-flush) + ) +) + +;; ============================================================= +;; REJESTRACJA SKRYPTU W MENU GIMP +;; ============================================================= + +(script-fu-register-filter "przem-hitchcock-d400-film-effect" + "_Hitchcock D400 Film Effect..." + "Konwertuje kolorowe zdjęcie na efekt analogowej kliszy HITCHCOCK D400.\n\ +Efekt obejmuje: ziarno filmu, winietowanie, korekcję kolorów (zielone cienie,\n\ +ciepłe światła), redukcję saturacji, soft-focus oraz chromatic vignette." + "AI Assistant" + "PRP" + "2026" + "RGB*, GRAY*" + SF-ONE-OR-MORE-DRAWABLE +) + +(script-fu-menu-register "przem-hitchcock-d400-film-effect" + "/Filters/PIETRASZCZYK/") diff --git a/script-fu/3.0/przem-wet-collodion-v3.scm b/script-fu/3.0/przem-wet-collodion-v3.scm index c757042..1fa2ba3 100644 --- a/script-fu/3.0/przem-wet-collodion-v3.scm +++ b/script-fu/3.0/przem-wet-collodion-v3.scm @@ -20,10 +20,10 @@ ; Generuj szum ;(plug-in-solid-noise RUN-NONINTERACTIVE img noise-layer 0 0 (random 1000) 0 4 4) - (let* ((noise-width (cadddr (gimp-drawable-mask-intersect noise-layer))) - (noise-height (caddr (cddr (gimp-drawable-mask-intersect noise-layer))))) + (let* ((noise-width (cadddr (gimp-drawable-mask-intersect drawable))) + (noise-height (caddr (cddr (gimp-drawable-mask-intersect drawable))))) - (gimp-drawable-merge-new-filter noise-layer "gegl:noise-solid" 0 LAYER-MODE-REPLACE 1.0 "tileable" FALSE "turbulent" FALSE "seed" 0 + (gimp-drawable-merge-new-filter noise-layer "gegl:noise-solid" 0 LAYER-MODE-REPLACE 1.0 "tileable" FALSE "turbulent" FALSE "seed" (random 100) "detail" 1 "x-size" 4.0 "y-size" 4.0 "width" noise-width "height"noise-height)) @@ -71,7 +71,7 @@ (gimp-layer-set-offsets floating-sel 0 0) (gimp-floating-sel-anchor floating-sel)) - (gimp-layer-set-opacity noise-layer 0) + (gimp-layer-set-opacity noise-layer 80) ; Ustaw przezroczystość dla każdego kanału (gimp-layer-set-opacity h-channel intensity-h) diff --git a/script-fu/changelog.md b/script-fu/changelog.md index f15ef41..3f57f14 100644 --- a/script-fu/changelog.md +++ b/script-fu/changelog.md @@ -1,4 +1,7 @@ -# [2.260421-0] REpzytorium dla 3.2 +# [2.260424-0] przem-hitchcock-d400-film-effect.scm +* Nowy filtr imitujący film Hitchcock d400 - alpha + +# [2.260421-0] Repzytorium dla 3.2 * Init # [2.260409-0] przem-teal-portrait-look-v3 -- cgit v1.2.3