summaryrefslogtreecommitdiffstats
path: root/plug-ins/script-fu/scripts/contactsheet.scm
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--plug-ins/script-fu/scripts/contactsheet.scm337
1 files changed, 337 insertions, 0 deletions
diff --git a/plug-ins/script-fu/scripts/contactsheet.scm b/plug-ins/script-fu/scripts/contactsheet.scm
new file mode 100644
index 0000000..5f7520e
--- /dev/null
+++ b/plug-ins/script-fu/scripts/contactsheet.scm
@@ -0,0 +1,337 @@
+; "Contact Sheet" v1.2 September 5, 2007
+; by Kevin Cozens <kcozens@interlog.com>
+;
+; 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/>.
+;
+; Version 1.0 (July 27, 2004)
+; Created
+;
+; Version 1.1 (September 2, 2004)
+; Added ability to select sheet size, set font used for sheet and image
+;
+; Version 1.2 (September 5, 2007)
+; Preserve aspect ratio of original image. Center thumbnail in the area
+; allowed for the thumbnail. Added disable/enable of undo operations.
+; Added 1600x1200 sheet size.
+
+(define (script-fu-contactsheet dir sheet-size
+ title-font legend-font text-color bg-color)
+
+ (define (init-sheet-data size)
+ (let (
+ (sheet-w 0)
+ (sheet-h 0)
+ (thumb-w 0)
+ (thumb-h 0)
+ (border-x 0) ;Space between rows and at top and bottom of thumbnails
+ (border-y 0) ;Space between columns and at left and right of thumbnails
+ (off-x 0) ; Additional X shift to properly center a row of thumbnails
+ (off-y 0) ; Additional Y shift to properly center rows of thumbnails
+ (count 0)
+ )
+
+ (case size
+ ((0) (set! sheet-w 640)
+ (set! sheet-h 480)
+ (set! thumb-w 90)
+ (set! thumb-h 68)
+ (set! border-x 32)
+ (set! border-y 23)
+ (set! off-x -1)
+ (set! off-y 0)
+ (set! count 4)
+ )
+
+ ((1) (set! sheet-w 800)
+ (set! sheet-h 600)
+ (set! thumb-w 119)
+ (set! thumb-h 90)
+ (set! border-x 34)
+ (set! border-y 25)
+ (set! off-x 0)
+ (set! off-y 0)
+ (set! count 4)
+ )
+
+ ((2) (set! sheet-w 1024)
+ (set! sheet-h 768)
+ (set! thumb-w 133)
+ (set! thumb-h 100)
+ (set! border-x 32)
+ (set! border-y 24)
+ (set! off-x 1)
+ (set! off-y 0)
+ (set! count 5)
+ )
+
+ ((3) (set! sheet-w 1280)
+ (set! sheet-h 1024)
+ (set! thumb-w 133)
+ (set! thumb-h 100)
+ (set! border-x 24)
+ (set! border-y 25)
+ (set! off-x 0)
+ (set! off-y 0)
+ (set! count 7)
+ )
+
+ ((4) (set! sheet-w 1600)
+ (set! sheet-h 1200)
+ (set! thumb-w 120)
+ (set! thumb-h 90)
+ (set! border-x 36)
+ (set! border-y 25)
+ (set! off-x 2)
+ (set! off-y 0)
+ (set! count 9)
+ )
+ )
+
+ (list sheet-w sheet-h thumb-w thumb-h border-x border-y off-x off-y count)
+ )
+ )
+
+ (define (init-sheet-img img num img-width border-y off-y)
+ (let* (
+ (text-layer 0)
+ (text-width 0)
+ (text-height 0)
+ )
+ (gimp-selection-all img)
+ (gimp-drawable-fill (car (gimp-image-get-active-layer img))
+ FILL-BACKGROUND)
+ (gimp-selection-none img)
+ (set! text-layer (car (gimp-text-fontname img -1 0 0
+ (string-append _"Contact Sheet "
+ (number->string num)
+ _" for directory " dir)
+ 0 TRUE 14 PIXELS title-font)))
+ (set! text-width (car (gimp-drawable-width text-layer)))
+ (set! text-height (car (gimp-drawable-height text-layer)))
+ (gimp-layer-set-offsets text-layer
+ (/ (- img-width text-width) 2)
+ (/ (- (+ border-y off-y) text-height) 2)
+ )
+ (gimp-image-merge-visible-layers img CLIP-TO-IMAGE)
+ )
+ )
+
+ (define (make-thumbnail-size img thumb-w thumb-h)
+ (let* (
+ (file-height (car (gimp-image-height img)))
+ (file-width (car (gimp-image-width img)))
+ (aspect-ratio (/ file-width file-height))
+ )
+
+ ;Preserve the aspect ratio of the original image
+ (if (> file-width file-height)
+ (set! thumb-h (/ thumb-w aspect-ratio))
+ (set! thumb-w (* thumb-h aspect-ratio))
+ )
+
+ (gimp-image-scale img thumb-w thumb-h)
+ )
+ )
+
+ (let* (
+ (dir-stream (dir-open-stream dir))
+ (sheet-num 1)
+ (img-count 0)
+ (pos-x 0)
+ (pos-y 0)
+
+ (sheet-data 0)
+ (sheet-width 0)
+ (sheet-height 0)
+ (thumb-w 0)
+ (thumb-h 0)
+ (border-x 0)
+ (border-y 0)
+ (off-x 0)
+ (off-y 0)
+ (max-x 0)
+ (max-y 0)
+
+ (sheet-img 0)
+ (sheet-layer 0)
+
+ (new-img 0)
+ (file 0)
+ (file-path 0)
+ (tmp-layer 0)
+ )
+
+ (gimp-context-push)
+ (gimp-context-set-defaults)
+ (gimp-context-set-foreground text-color)
+ (gimp-context-set-background bg-color)
+
+ (set! sheet-data (init-sheet-data sheet-size))
+ (set! sheet-width (car sheet-data))
+ (set! sheet-height (cadr sheet-data))
+ (set! sheet-data (cddr sheet-data))
+ (set! thumb-w (car sheet-data))
+ (set! thumb-h (cadr sheet-data))
+ (set! sheet-data (cddr sheet-data))
+ (set! border-x (car sheet-data))
+ (set! border-y (cadr sheet-data))
+ (set! sheet-data (cddr sheet-data))
+ (set! off-x (car sheet-data))
+ (set! off-y (cadr sheet-data))
+ (set! max-x (caddr sheet-data))
+ (set! max-y max-x)
+
+ (set! sheet-img (car (gimp-image-new sheet-width sheet-height RGB)))
+
+ (gimp-image-undo-disable sheet-img)
+
+ (set! sheet-layer (car (gimp-layer-new sheet-img sheet-width sheet-height
+ RGB-IMAGE "Background"
+ 100 LAYER-MODE-NORMAL)))
+ (gimp-image-insert-layer sheet-img sheet-layer 0 0)
+
+ (init-sheet-img sheet-img sheet-num sheet-width border-y off-y)
+
+ (if (not dir-stream)
+ (gimp-message (string-append _"Unable to open directory " dir))
+ (begin
+ (do
+ ( (file (dir-read-entry dir-stream) (dir-read-entry dir-stream)) )
+ ( (eof-object? file) )
+
+ (set! file-path (string-append dir DIR-SEPARATOR file))
+ (if (and (not (re-match "index.*" file))
+ (= (file-type file-path) FILE-TYPE-FILE)
+ )
+ (catch ()
+ (set! new-img
+ (car (gimp-file-load RUN-NONINTERACTIVE file-path file)))
+
+ (make-thumbnail-size new-img thumb-w thumb-h)
+
+ (if (> (car (gimp-image-get-layers new-img)) 1)
+ (gimp-image-flatten new-img)
+ )
+ (set! tmp-layer (car (gimp-layer-new-from-drawable
+ (car (gimp-image-get-active-drawable new-img))
+ sheet-img)))
+
+ (gimp-image-insert-layer sheet-img tmp-layer 0 0)
+
+ ;Move thumbnail in to position and center it in area available.
+ (gimp-layer-set-offsets tmp-layer
+ (+ border-x off-x (* pos-x (+ thumb-w border-x))
+ (/ (- thumb-w (car (gimp-image-width new-img))) 2)
+ )
+ (+ border-y off-y (* pos-y (+ thumb-h border-y))
+ (/ (- thumb-h (car (gimp-image-height new-img))) 2)
+ )
+ )
+
+ (gimp-image-delete new-img)
+
+ (set! tmp-layer (car (gimp-text-fontname sheet-img -1 0 0 file
+ 0 TRUE 12 PIXELS legend-font)))
+ (gimp-layer-set-offsets tmp-layer
+ (+ border-x off-x (* pos-x (+ thumb-w border-x))
+ (/ (- thumb-w (car (gimp-drawable-width tmp-layer))) 2))
+ (+ border-y off-y (* pos-y (+ thumb-h border-y)) thumb-h 6)
+ )
+
+ (set! img-count (+ img-count 1))
+
+ (set! pos-x (+ pos-x 1))
+ (if (> pos-x max-x)
+ (begin
+ (set! pos-x 0)
+ (set! pos-y (+ pos-y 1))
+ (if (> pos-y max-y)
+ (begin
+ (set! pos-y 0)
+ (set! sheet-layer (car (gimp-image-flatten sheet-img)))
+ (gimp-file-save
+ RUN-NONINTERACTIVE
+ sheet-img
+ sheet-layer
+ (string-append dir DIR-SEPARATOR
+ "index" (number->string sheet-num) ".jpg")
+ (string-append
+ "index" (number->string sheet-num) ".jpg")
+ )
+
+ (set! sheet-num (+ sheet-num 1))
+ (init-sheet-img sheet-img sheet-num sheet-width
+ border-y off-y)
+ (set! img-count 0)
+ )
+ )
+ )
+ )
+ )
+ )
+ )
+
+ (dir-close-stream dir-stream)
+
+ (if (> img-count 0)
+ (begin
+ (set! sheet-layer (car (gimp-image-flatten sheet-img)))
+ (gimp-file-save
+ RUN-NONINTERACTIVE
+ sheet-img
+ sheet-layer
+ (string-append dir DIR-SEPARATOR
+ "index" (number->string sheet-num) ".jpg")
+ (string-append "index" (number->string sheet-num) ".jpg")
+ )
+ )
+ )
+ )
+
+ (gimp-image-undo-enable sheet-img)
+ (gimp-image-delete sheet-img)
+
+ (display (string-append _"Created " (number->string sheet-num)
+ _" contact sheets from a total of "
+ (number->string img-count) _" images"))
+ (newline)
+ )
+
+ (gimp-context-pop)
+ )
+)
+
+(script-fu-register "script-fu-contactsheet"
+ _"_Contact Sheet..."
+ _"Create a series of images containing thumbnail sized versions of all of the images in a specified directory."
+ "Kevin Cozens <kcozens@interlog.com>"
+ "Kevin Cozens"
+ "July 19, 2004"
+ ""
+ SF-DIRNAME _"Images Directory" "/tmp/test"
+ SF-OPTION _"Sheet size" '("640 x 480"
+ "800 x 600"
+ "1024 x 768"
+ "1280 x 1024"
+ "1600 x 1200")
+ SF-FONT _"Title font" "Sans Bold Italic"
+ SF-FONT _"Legend font" "Sans Bold"
+ SF-COLOR _"Text color" "white"
+ SF-COLOR _"Background color" "black"
+)
+
+(script-fu-menu-register "script-fu-contactsheet" "<Image>/Filters/Combine")