I think that this line is not returning the number of layers as we're expecting. I tried using gimp-message to write the number of layers out to the console, but it generates another batch execution error.
Here is the code: (define (batch-save-as-xcf pattern) (let* ( (filelist (cadr (file-glob pattern 1))) (fileparts) (xcfname) (filename) (image) (newimage) (drawable) (num-layers) (layerIDs) (pos) (layerToKeep) (i) ) (gimp-message-set-handler 2) (gimp-message "Preparing to act on the following files") (gimp-message pattern) (while (pair? filelist) ; set filename to the name of the current file in the glob (set! filename (car filelist)) (gimp-message "The current file is: ") (gimp-message filename) ; set xcfname by tokenizing on "." and taking everything but the last part (set! fileparts (strbreakup filename ".")) (set! fileparts (butlast fileparts)) (set! xcfname (string-append (unbreakupstr fileparts ".") ".xcf")) (gimp-message "The new filename will be: ") (gimp-message xcfname) ; set image from the file, and then get the first layer and set it to newimage (gimp-message "Loading File.") (set! newimage (car (gimp-file-load RUN-NONINTERACTIVE filename filename))) (set! num-layers (car (gimp-image-get-layers newimage))) (set! layerIDs (cadr (gimp-image-get-layers newimage))) (gimp-message "The current file has the following number of layers: ") (gimp-message num-layers) ;(set! layerToKeep 0) ;(set! pos 0) ;(while (< pos num-layers) ;(unless (= pos layerToKeep) ;(gimp-image-remove-layer newimage (vector-ref layerIDs pos)) ;) ; (set! i (+ i 1)) ; ) ; set drawable to the newimage (gimp-message "Setting the Drawable.") (set! drawable (car (gimp-image-flatten newimage))) ; save the drawable from newimage as xcfname (gimp-message "Saving the new file.") (gimp-file-save RUN-NONINTERACTIVE newimage drawable xcfname xcfname) ;(gimp-image-delete image) ;(gimp-image-delete newimage) (set! filelist (cdr filelist)) ) ) ) Here is the output: script-fu.exe-Warning: Preparing to act on the following files script-fu.exe-Warning: c:\test\ArroyoSanJose-014.tif script-fu.exe-Warning: The current file is: script-fu.exe-Warning: c:\test\ArroyoSanJose-014.tif script-fu.exe-Warning: The new filename will be: script-fu.exe-Warning: c:\test\ArroyoSanJose-014.xcf script-fu.exe-Warning: Loading File. TIFF image-Warning: Warning: The image you are loading has 16 bits per channel. GIMP can only handle 8 bit, s o it will be converted for you. Information will be lost because of this convers ion. script-fu.exe-Warning: The current file has the following number of layers: batch command experienced an execution error (Type any character to close this window) On Sat, Jul 24, 2010 at 9:39 AM, Dillon <dillonontheco...@gmail.com> wrote: > It just says: > > batch command experienced an execution error > > (Type any character to close this window) > > > Is there a way to get the batch engine to provide more verbose output? > > You're probably right about the variable declarations. Doh! > > On Sat, Jul 24, 2010 at 4:11 AM, Cameron Gregory <c...@bloke.com> wrote: > >> what is the error? >> >> But you need to declare num-layers and layerID's at the top (like newimage >> and drawable) >> >> Cameron >> >> On 24/07/2010, at 3:35 PM, Dillon wrote: >> >> As soon as I add in either of these lines: >> >> (set! num-layers (car (gimp-image-get-layers newimage))) >> (set! layerIDs (cadr (gimp-image-get-layers newimage))) >> >> >> I get batch command execution errors. >> >> The full script is: >> >> (define (batch-save-as-xcf pattern) >> (let* ( >> (filelist (cadr (file-glob pattern 1))) >> (fileparts) >> (xcfname) >> (filename) >> (image) >> (newimage) >> (drawable) >> ) >> (gimp-message-set-handler 2) >> (gimp-message "Preparing to act on the following files") >> (gimp-message pattern) >> >> (while (pair? filelist) >> ; set filename to the name of the current file in the glob >> (set! filename (car filelist)) >> (gimp-message "The current file is: ") >> (gimp-message filename) >> >> ; set xcfname by tokenizing on "." and taking everything but the last >> part >> (set! fileparts (strbreakup filename ".")) >> (set! fileparts (butlast fileparts)) >> (set! xcfname (string-append (unbreakupstr fileparts ".") ".xcf")) >> (gimp-message "The new filename will be: ") >> (gimp-message xcfname) >> ; set image from the file, and then get the first layer and set it to >> newimage >> (gimp-message "Loading File.") >> (set! newimage (car (gimp-file-load RUN-NONINTERACTIVE filename >> filename))) >> (set! num-layers (car (gimp-image-get-layers newimage))) >> (set! layerIDs (cadr (gimp-image-get-layers newimage))) >> >> ; set drawable to the newimage >> (gimp-message "Setting the Drawable.") >> >> (set! drawable (car (gimp-image-flatten newimage))) >> >> >> ; save the drawable from newimage as xcfname >> (gimp-message "Saving the new file.") >> (gimp-file-save RUN-NONINTERACTIVE newimage drawable xcfname xcfname) >> >> (set! filelist (cdr filelist)) >> ) >> ) >> ) >> >> >> >> >> Date: Sun, 06 Jun 2010 17:46:15 -0400 >> From: saulgo...@flashingtwelve.brickfilms.com >> Subject: Re: [Gimp-user] Script-Fu for batch image conversion >> To: gimp-user@lists.XCF.Berkeley.EDU >> Message-ID: >> <20100606174615.awibbw09xk44k...@flashingtwelve.brickfilms.com> >> Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; >> format="flowed" >> >> Quoting Dillon <dillonontheco...@gmail.com>: >> >> > The reason I'm writing my own script-fu, rather than using Daves Batch >> > Processor, is that my TIF files are multi-page, and when I load the >> image >> > and flatten it to a drawable, I end up with both pages flattened into >> one >> > drawable. I only want one of the pages (I think the first). >> > >> > I need to find a way to select that page (which I assume is turned into >> a >> > layer when the TIF is loaded), and just set that layer to be my >> drawable. >> >> In that case, you were on the right track originally with using >> 'gimp-image-get-layers' (I am also assuming multi-page TIFFs load as >> separate layers). However, you had incorrectly handled the value >> returned by the function. >> >> 'gimp-image-get-layers' returns returns a list containing two >> elements: the number of layers in the image and an array of the >> layerIDs of those layers: >> >> (set! num-layers (car (gimp-image-get-layers image))) >> (set! layerIDs (cadr (gimp-image-get-layers image))) >> >> You can obtain the layerID of the top layer with: >> >> (set! top-layer (vector-ref layerIDs 0)) >> >> The next down with: >> >> (set! next-layer (vector-ref layerIDs 1)) >> >> And so on: >> >> (set! bottom-layer (vector-ref layerIDs (- num-layers 1))) >> >> >> If you know the position of the layer you wish to keep (the TIFF >> page), you can then remove all of the other layers from the image with: >> >> (set! pos 0) >> (while (< pos num-layers) >> (unless (= pos TIFFpage) >> (gimp-image-remove-layer image (vector-ref layerIDs pos)) >> ) >> (set! i (+ i 1)) >> ) >> >> _______________________________________________ >> Gimp-user mailing list >> >> Gimp-user@lists.XCF.Berkeley.EDU >> https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user >> >> >> >
_______________________________________________ Gimp-user mailing list Gimp-user@lists.XCF.Berkeley.EDU https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-user