Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/Gimp/plug-ins/script-fu/scripts/   (Gimp Bildeditor Version 3.2.0©)  Datei vom 14.2.2026 mit Größe 9 kB image not shown  

Quelle  blend-anim.scm  Sprache: unbekannt

 
Spracherkennung für: .scm vermutete Sprache: Abap {ABAP[66] Lisp[44] Masm[44]} [Methode: maximale Elemente, drei Dimensionen]

; GIMP - The GNU Image Manipulation Program
; Copyright (C) 1995 Spencer Kimball and Peter Mattis
;
; 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 <https://www.gnu.org/licenses/>.
;
;
; blend-anim.scm   version 1.03   1999/12/21
;
; CHANGE-LOG:
; 1.00 - initial release
; 1.01 - some code cleanup, no real changes
; 1.02 - use gimp-message to output an error message if called
;        with less than three layers
; 1.03 - only call blur plugin when blut-radius >= 1.0
;
; Copyright (C) 1997-1999 Sven Neumann <sven@gimp.org>
;
;
; Blends two or more layers over a background, so that an animation can
; be saved. A minimum of three layers is required.

(define (script-fu-blend-anim img
                              drawables
                              frames
                              max-blur
                              looped)

  (define (multi-raise-layer image layer times)
    (while (> times 0)
       (gimp-image-raise-item image layer)
       (set! times (- times 1))
    )
  )

  (let* (
        (max-blur (max max-blur 0))
        (frames (max frames 0))
        (image (car (gimp-image-duplicate img)))
        (width (car (gimp-image-get-width image)))
        (height (car (gimp-image-get-height image)))
        (layer-array (car (gimp-image-get-layers image)))
        (num-layers (vector-length layer-array))
        (slots (- num-layers 2))
        (bg-layer (vector-ref layer-array (- num-layers 1)))
        (max-width 0)
        (max-height 0)
        (offset-x 0)
        (offset-y 0)
        )

    (if (> num-layers 2)
        (begin
    (gimp-image-undo-disable image)

    (if (= looped TRUE)
     ; add a copy of the lowest blend layer on top
     (let* ((copy (car (gimp-layer-copy
       (vector-ref layer-array (- num-layers 2))))))
                                (gimp-layer-add-alpha copy)
    (gimp-image-insert-layer image copy 0 0)
    (set! layer-array (car (gimp-image-get-layers image)))
    (set! num-layers (vector-length layer-array))
    (set! slots (- num-layers 2))
    (set! bg-layer (vector-ref layer-array (- num-layers 1)))))

    ; make all layers invisible and check for sizes
    (let* ((min-offset-x width)
     (min-offset-y height)
     (layer-count slots))
   (gimp-item-set-visible bg-layer FALSE)
   (while (> layer-count -1)
       (let* ((layer (vector-ref layer-array layer-count))
      (layer-width (+ (car (gimp-drawable-get-width layer))
        (* max-blur 2)))
      (layer-height (+ (car (gimp-drawable-get-height layer))
         (* max-blur 2)))
      (layer-offsets (gimp-drawable-get-offsets layer))
      (layer-offset-x (- (car layer-offsets) max-blur))
      (layer-offset-y (- (cadr layer-offsets) max-blur)))
     (gimp-item-set-visible layer FALSE)
     (set! max-width (max max-width layer-width))
     (set! max-height (max max-height layer-height))
     (set! min-offset-x (min min-offset-x layer-offset-x))
     (set! min-offset-y (min min-offset-y layer-offset-y))
     (set! layer-count (- layer-count 1))))
   (set! offset-x (- (car (gimp-drawable-get-offsets bg-layer))
       min-offset-x))
   (set! offset-y (- (cadr (gimp-drawable-get-offsets bg-layer))
       min-offset-y)))

    ; create intermediate frames by merging copies of adjacent layers
    ; with the background layer
    (let* ((layer-count slots))
   (while (> layer-count 0)
      (let* ((frame-count frames)
      (lower-layer (vector-ref layer-array layer-count))
      (upper-layer (vector-ref layer-array (- layer-count 1))))
     (while (> frame-count 0)
     (let* ((opacity (* (/ frame-count (+ frames 1)) 100))
       (blur (/ (* opacity max-blur) 100))
       (upper-copy (car (gimp-layer-copy upper-layer)))
       (lower-copy (car (gimp-layer-copy lower-layer)))
       (bg-copy (car (gimp-layer-copy bg-layer))))
                                  (gimp-layer-add-alpha upper-copy)
                                  (gimp-layer-add-alpha lower-copy)
                                  (gimp-layer-add-alpha bg-copy)
      (gimp-image-insert-layer image bg-copy 0 0)
      (gimp-image-insert-layer image lower-copy 0 0)
      (gimp-image-insert-layer image upper-copy 0 0)
      (gimp-item-set-visible upper-copy TRUE)
      (gimp-item-set-visible lower-copy TRUE)
      (gimp-item-set-visible bg-copy TRUE)
      (gimp-layer-set-opacity upper-copy (- 100 opacity))
      (gimp-layer-set-opacity lower-copy opacity)
      (gimp-layer-set-opacity bg-copy 100)
      (if (> max-blur 0)
      (let* ((layer-width (car (gimp-drawable-get-width upper-copy)))
       (layer-height (car (gimp-drawable-get-height upper-copy))))
     (gimp-layer-set-lock-alpha upper-copy FALSE)
     (gimp-layer-resize upper-copy
          (+ layer-width (* blur 2))
          (+ layer-height (* blur 2))
          blur
          blur)
     (if (>= blur 1.0)
                                          (gimp-drawable-merge-new-filter upper-copy "gegl:gaussian-blur" 0 LAYER-MODE-REPLACE 1.0
                                                                          "std-dev-x" (* 0.32 blur) "std-dev-y" (* 0.32 blur) "filter" "auto")
                                        )
     (set! blur (- max-blur blur))
     (gimp-layer-set-lock-alpha lower-copy FALSE)
     (set! layer-width (car (gimp-drawable-get-width
        lower-copy)))
     (set! layer-height (car (gimp-drawable-get-height
         lower-copy)))
     (gimp-layer-resize lower-copy
          (+ layer-width (* blur 2))
          (+ layer-height (* blur 2))
          blur
          blur)
     (if (>= blur 1.0)
                                          (gimp-drawable-merge-new-filter lower-copy "gegl:gaussian-blur" 0 LAYER-MODE-REPLACE 1.0
                                                                          "std-dev-x" (* 0.32 blur) "std-dev-y" (* 0.32 blur) "filter" "auto"))))
      (gimp-layer-resize bg-copy
        max-width
        max-height
        offset-x
        offset-y)
      (let* ((merged-layer (car (gimp-image-merge-visible-layers
          image CLIP-TO-IMAGE))))
     (gimp-item-set-visible merged-layer FALSE))
      (set! frame-count (- frame-count 1))))
     (set! layer-count (- layer-count 1)))))

    ; merge all original blend layers but the lowest one
     ; with copies of the background layer
    (let* ((layer-count 0))
   (while (< layer-count slots)
       (let* ((orig-layer (vector-ref layer-array layer-count))
      (bg-copy (car (gimp-layer-copy bg-layer TRUE))))
     (gimp-image-insert-layer image
         bg-copy
         -1
         (* layer-count (+ frames 1)))
     (multi-raise-layer image
      orig-layer
      (+ (* (- slots layer-count) frames) 1))
     (gimp-item-set-visible orig-layer TRUE)
     (gimp-item-set-visible bg-copy TRUE)
     (gimp-layer-resize bg-copy
      max-width
      max-height
      offset-x
      offset-y)
     (let* ((merged-layer (car (gimp-image-merge-visible-layers
        image CLIP-TO-IMAGE))))
      (gimp-item-set-visible merged-layer FALSE))
      (set! layer-count (+ layer-count 1)))))

    ; merge the lowest blend layer with the background layer
    (let* ((orig-layer (vector-ref layer-array (- num-layers 2))))
   (gimp-item-set-visible bg-layer TRUE)
   (gimp-item-set-visible orig-layer TRUE)
   (gimp-image-merge-visible-layers image CLIP-TO-IMAGE))

    ; make all layers visible again
    (let* ((result-layer-array (car (gimp-image-get-layers image)))
     (num-result-layers (vector-length result-layer-array))
     (layer-count (- num-result-layers 1)))
   (while (> layer-count -1)
      (let* ((layer (vector-ref result-layer-array layer-count))
      (name (string-append _"Frame" " "
             (number->string
       (- num-result-layers layer-count) 10))))
     (gimp-item-set-visible layer TRUE)
     (gimp-item-set-name layer name)
     (set! layer-count (- layer-count 1))))

   (if (= looped TRUE)
    ; remove the topmost layer
    (gimp-image-remove-layer image (vector-ref result-layer-array 0))))

    (gimp-image-undo-enable image)
    (gimp-display-new image)
    (gimp-displays-flush)
  )

      (gimp-message _"Blend Animation needs at least three source layers")
    )
  )
)

(script-fu-register-filter "script-fu-blend-anim"
    _"_Blend..."
    _"Create intermediate layers to blend two or more layers over a background as an animation"
    "Sven Neumann <sven@gimp.org>"
    "Sven Neumann"
    "1999/12/21"
    "RGB* GRAY*"
    SF-ONE-OR-MORE-DRAWABLE
    SF-ADJUSTMENT _"Intermediate frames" '(3 1 1024 1 10 0 1)
    SF-ADJUSTMENT _"Max. blur radius"    '(0 0 1024 1 10 0 1)
    SF-TOGGLE     _"Looped"              TRUE
)

(script-fu-menu-register "script-fu-blend-anim"
                         "<Image>/Filters/Animation/")

[Dauer der Verarbeitung: 0.2 Sekunden, vorverarbeitet 2026-10-27]