Save layers as separate png's?
#1
Posted 17 November 2008 - 11:28 PM
Preferably naming them same as layer name.
#2
Posted 17 November 2008 - 11:51 PM
#3
Posted 18 November 2008 - 09:38 AM
But for some strange reason that script rendered out all frames as separate images but with the layer and all layers below it visible...
#4
Posted 18 November 2008 - 10:49 AM
rylleman said:
But for some strange reason that script rendered out all frames as separate images but with the layer and all layers below it visible...
Oops! That script was intended more for animated GIFs (and performed an "unoptimize" before saving). Try the script at http://flashingtwelv...-all-layers.scm
#6
Posted 20 January 2009 - 05:28 PM
Forgive my newbness/bumping this thread - but is there a way of specifying a different directory? Whenever
I try and put the directory in the output filename, it says it can't find it. But I'm sure the directory
is correct.
#7
Posted 20 January 2009 - 06:29 PM
Now do you notice are 2 different links posted for 2 different scripts?
To which you refer?
Ahhh...you are using Windows ? (Often Windows paths needs to be written in a slightly different way)
#8
Posted 21 January 2009 - 11:15 AM
Mikahl said:
Try using forward slashes ("/") instead of backslashes ("\") in the directory path you enter.
#9
Posted 21 January 2009 - 05:27 PM
I'm on OS X, which is based on OpenBSD, and uses "/". It turns out I just have to use the full-path ( duh ). I thought I could start
relative to only my home directory, but it only recognizes absolute paths :P
#10
Posted 11 February 2009 - 10:19 PM
Now one thing that would be even more helpful would be if one could choose to export only visible layers. Would this be easy to implement in this script? If so, could anyone give me some pointers as to where to start?
#11
Posted 12 February 2009 - 12:23 AM
For extra credit, modify the script to add it as a checkbox option to the dialog.
(define (get-visible-layers image)
(let* (
(all-layers (gimp-image-get-layers image))
(i (car all-layers))
(viewable '())
)
(set! all-layers (cadr all-layers))
(while (> i 0)
(set! i (- i 1))
(if (= (car (gimp-drawable-get-visible (vector-ref all-layers i))) TRUE)
(set! viewable (cons (vector-ref all-layers i) viewable))
)
)
viewable
)
)
#12
Posted 14 February 2009 - 11:54 AM
That's excellent, worked very well!
I'll get back to this thread when I've got that tickbox working, right now I just use two different versions of the script.
#13
Posted 30 April 2009 - 10:02 AM
I've added a "save only visible layers" checkbox, if anyone's interested. Not sure I did this right though, so anything wrong with my patch, please share!
Cheers,
Egor
; 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 2 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.
;; Command is installed in "File->Save all layers..."
;;
;; A template string should be provided which fits the form: prefix~~~~.ext
;; where prefix is a character string (optionally null).
;; ~~~~ represents the digits of the frame number, one ~ per digit
;; ext is the filename extension (which also specifies the format)
;; the tildas are optional and four digits will be assumed if omitted.
;; an extension of .png is assumed if one is not provided
;; the period is significant, if PNG is not to be assumed
;;
;; A checkbox provides the option of using the layernames for the
;; filenames. The extension given in the template is used to determine
;; the file type. Animation settings (delay and frame disposal) are not
;; included as part of the filename.
;;
;; When saving to GIF files, the GIMP's default values are used to
;; convert to INDEXED mode (255 color palette, no dithering).
;; Note: this is done on a layer-by-layer basis, so more colors may result
;; than if the entire image were converted to INDEXED before saving.
(define (sg-save-all-layers orig-image drawable
template
rename?
save-only-visible-layers)
(define (get-all-layers img)
(let* (
(all-layers (gimp-image-get-layers img))
(i (car all-layers))
(bottom-to-top ())
)
(set! all-layers (cadr all-layers))
(while (> i 0)
(set! bottom-to-top (append bottom-to-top (cons (aref all-layers (- i 1)) '())))
(set! i (- i 1))
)
bottom-to-top
)
)
(define (get-visible-layers image)
(let* (
(all-layers (gimp-image-get-layers image))
(i (car all-layers))
(viewable '())
)
(set! all-layers (cadr all-layers))
(while (> i 0)
(set! i (- i 1))
(if (= (car (gimp-drawable-get-visible (vector-ref all-layers i))) TRUE)
(set! viewable (cons (vector-ref all-layers i) viewable))
)
)
viewable
)
)
(define (save-layer orig-image layer name)
(let* (
(image 0)
(buffer "")
)
(set! buffer (car (gimp-edit-named-copy layer "temp-copy")))
(set! image (car (gimp-edit-named-paste-as-new buffer)))
(when (and (not (= (car (gimp-image-base-type image)) INDEXED))
(string-ci=? (car (last (strbreakup name "."))) "gif"))
(gimp-image-convert-indexed image
NO-DITHER
MAKE-PALETTE
255
FALSE
FALSE
"")
)
(gimp-file-save RUN-NONINTERACTIVE image (car (gimp-image-get-active-layer image)) name name)
(gimp-buffer-delete buffer)
(gimp-image-delete image)
)
)
(let* (
(layers nil)
(fullname "")
(basename "")
(layername "")
(format "")
(layerpos 1)
(framenum "")
(settings "")
(default-extension "png")
(extension "png")
(orig-selection 0)
)
(gimp-image-undo-disable orig-image)
(set! orig-selection (car (gimp-selection-save orig-image)))
(gimp-selection-none orig-image)
(set! extension (strbreakup template "."))
(set! extension (if (> (length extension) 1)
(car (last extension))
default-extension))
(when (= (string-length extension) 0)
(set! default-extension "png"))
(when (= rename? TRUE)
(set! format (strbreakup template "~"))
(if (> (length format) 1)
(begin
(set! basename (car format))
(set! format (cdr format))
(set! format (cons "" (butlast format)))
(set! format (string-append "0" (unbreakupstr format "0")))
)
(begin
(set! basename (car (strbreakup template ".")))
(set! format "0000")
)
)
)
(if (= save-only-visible-layers TRUE)
(set! layers (get-visible-layers orig-image))
(set! layers (get-all-layers orig-image))
)
(while (pair? layers)
(if (= rename? TRUE)
(begin
(set! framenum (number->string layerpos))
(set! framenum (string-append
(substring format 0 (- (string-length format)
(string-length framenum))) framenum))
(set! fullname (string-append basename framenum))
)
(begin
(set! fullname (car (strbreakup
(car (gimp-drawable-get-name (car layers))) "(")))
(gimp-drawable-set-name (car layers) fullname)
(set! fullname (car (gimp-drawable-get-name (car layers))))
)
)
(set! fullname (string-append fullname "." extension))
(save-layer orig-image (car layers) fullname)
(set! layers (cdr layers))
(set! layerpos (+ layerpos 1))
)
(gimp-selection-load orig-selection)
(gimp-image-remove-channel orig-image orig-selection)
(gimp-image-undo-enable orig-image)
)
)
(script-fu-register "sg-save-all-layers"
"Save all layers..."
"Save each layer to a file."
"Saul Goode"
"Saul Goode"
"11/16/2008"
""
SF-IMAGE "Image" 0
SF-DRAWABLE "Drawable" 0
SF-STRING "Name Template (~ replaced by layer position)" "frame_~~~~.png"
SF-TOGGLE "Rename (ex: 'frame__0001')" TRUE
SF-TOGGLE _"Save only visible layers" TRUE
)
(script-fu-menu-register "sg-save-all-layers"
"/File/")
#15
Posted 07 October 2009 - 06:24 PM
#16
Posted 07 October 2009 - 07:57 PM
Or in your locale layers names are generated automatically with blanc spaces in ?
#17
Posted 07 October 2009 - 08:08 PM
as duplicating the bg layer "background copy"
#18
Posted 07 October 2009 - 08:47 PM
PhotoComix said:
Or in your locale layers names are generated automatically with blanc spaces in ?
The psd was sent to me so i could ask them to not use spaces or special characters but I'm hoping there is a way to account for special characters or blanks or even a different character set.
#19
Posted 08 October 2009 - 09:29 AM
solution may be a script to rename all layers in a shot (quite painful and slow rename manually 1 by 1) ...or automatically remove blank spaces
But i am not good in coding i hope other may help with a script to batch rename layers
#20
Posted 16 October 2011 - 09:10 PM
(set! fullname (string-append fullname "." extension))
(define (list-replace! l old new) ; FIRST-LEVEL replace
(while (pair? l)
(if(equal? (car l) old)(set-car! l new))
(set! l (cdr l))) l )
(define (string-replace str old-char new-char) ; old = "\, new = #\$
(let* ((l (string->list str)))
(list-replace! l old-char new-char)
(list->string l)))
(set! fullname (string-replace fullname #\space #\-))
(set! fullname (string-replace fullname #\/ #\-))
(set! fullname (string-replace fullname #\> #\-))
(set! fullname (string-replace fullname #\< #\-))
(save-layer orig-image (car layers) fullname)
This replaces: space, /, < and > to -
Works now nice for me on windows

Help














