Quoting Ofnuts <ofnuts@xxxxxxxxxxx>: > 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 Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer