Quoting Ofnuts <[email protected]>:
> My code needs to do a one-pixel-wide selection, at distance "x" from the
> current selection. This looks a lot like a border selection except that
> the border selection creates at best a two-pixel wide ribbon and I only
> want one (but if I'm wrong, please tell me how to :-)
>
> So far my code goes like this:
>
> # Selects pixels that are between x and x+1 pixels from
> # the original selection. Bumping the selection by one
> # each time doesn't work, a small circle degenerates into
> # a square with rounded corners instead of a big circle.
> def select_ribbon(self,image,selection,dist):
> pdb.gimp_selection_load(selection)
> pdb.gimp_selection_grow(image,dist+1)
> outer=pdb.gimp_selection_save(image)
> pdb.gimp_selection_load(selection)
> pdb.gimp_selection_grow(image,dist)
> inner=pdb.gimp_selection_save(image)
> pdb.gimp_channel_combine_masks(outer,inner,CHANNEL_OP_SUBTRACT,0,0)
> pdb.gimp_selection_load(outer)
> image.remove_channel(outer)
> image.remove_channel(inner)
>
> That works, but can be slow (especially since it's at the core of a
> loop). Is there any better way? Or useless code to jettison?
There is no need to create (and later delete) the 'outer' channel.
Just use the selection itself. In Script-fu, this would be done as
follows:
(gimp-selection-load selection)
(gimp-selection-grow image dist)
(set! inner (car (gimp-selection-save image)))
(gimp-selection-load selection)
(gimp-selection-grow image (+ dist 1))
(gimp-channel-combine-masks (car (gimp-image-get-selection image))
inner
CHANNEL-OP-SUBTRACT 0 0)
(gimp-image-remove-channel image inner)
_______________________________________________
Gimp-developer mailing list
[email protected]
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer