RSS/Atom feed Twitter
Site is read-only, email is disabled

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.

5 of 7 messages available
Toggle history

Please log in to manage your subscriptions.

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
Kevin Cozens
2010-07-24 17:45:24 UTC (over 14 years ago)

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.

Dillon
2010-07-24 18:39:16 UTC (over 14 years ago)

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))
)

Dillon
2010-07-24 18:50:45 UTC (over 14 years ago)

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))
)

Dillon
2010-07-24 18:51:23 UTC (over 14 years ago)

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))
)

saulgoode@flashingtwelve.brickfilms.com
2010-07-24 22:28:50 UTC (over 14 years ago)

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').