Script-Fu for batch image conversion
This discussion is connected to the gimp-user-list.gnome.org mailing list which is provided by the GIMP developers and not related to gimpusers.com.
This is a read-only list on gimpusers.com so this discussion thread is read-only, too.
AANLkTindhv-LGeVmVWCF2NOcAw... | 07 Oct 20:21 | |
Script-Fu for batch image conversion | Kevin Cozens | 24 Jul 17:45 |
5B2C8825-6AB3-47F0-9B6C-018... | 07 Oct 20:21 | |
Script-Fu for batch image conversion | Dillon | 24 Jul 18:39 |
Script-Fu for batch image conversion | Dillon | 24 Jul 18:50 |
Script-Fu for batch image conversion | Dillon | 24 Jul 18:51 |
Script-Fu for batch image conversion | saulgoode@flashingtwelve.brickfilms.com | 24 Jul 22:28 |
Script-Fu for batch image conversion
Dillon wrote:
(set! num-layers (car (gimp-image-get-layers newimage))) (set! layerIDs (cadr (gimp-image-get-layers newimage)))
What error messages do you get when the above lines are included?
(define (batch-save-as-xcf pattern) (let* (
(filelist (cadr (file-glob pattern 1))) (fileparts)
(xcfname)
(filename)
(image)
(newimage)
(drawable)
)
The declarations for variables "fileparts" through to "drawable" are wrong. You must provide an initial value when defining a variable in a let block.
The simple solution is to add a 0 or -1 to the declarations for numeric variables and "" string variables. Any value will work but it helps to stick to the a value similar to the type of value the variable could typically hold.
Script-Fu for batch image conversion
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 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: saulgoode@flashingtwelve.brickfilms.com Subject: Re: [Gimp-user] Script-Fu for batch image conversion To: gimp-user@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed"Quoting Dillon :
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))
)
Script-Fu for batch image conversion
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 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 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: saulgoode@flashingtwelve.brickfilms.com Subject: Re: [Gimp-user] Script-Fu for batch image conversion To: gimp-user@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed"Quoting Dillon :
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))
)
Script-Fu for batch image conversion
Sorry for being unclear - when I said "this line" I was referring to:
(set! num-layers (car (gimp-image-get-layers newimage)))
On Sat, Jul 24, 2010 at 9:50 AM, Dillon wrote:
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 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 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: saulgoode@flashingtwelve.brickfilms.com Subject: Re: [Gimp-user] Script-Fu for batch image conversion To: gimp-user@lists.XCF.Berkeley.EDU Message-ID:
Content-Type: text/plain; charset=ISO-8859-1; DelSp="Yes"; format="flowed"Quoting Dillon :
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))
)
Script-Fu for batch image conversion
Quoting Dillon :
Sorry for being unclear - when I said "this line" I was referring to:
(set! num-layers (car (gimp-image-get-layers newimage)))
On Sat, Jul 24, 2010 at 9:50 AM, Dillon wrote:
Here is the code:
:
:
(set! newimage (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
(set! num-layers (car (gimp-image-get-layers newimage))) :
:
The error is most likely owing to a failure of the file to load properly.
Try running the command:
(batch-save-as-xcf pattern)
in the Script-fu console (provide the full path to a TIFF file as 'pattern').