Re: Optimizing border-like selection in python

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



  Ahh... autoformatting... this should be easier to read... (sorry)

def create_border(image, selection_type='rectangle', size=1):
     is_selection, x1, y1, x2, y2 = pdb.gimp_selection_bounds(image)

     if is_selection:
         if size < 1:
             size = 1
         if selection_type =='rectangle':
             pdb.gimp_rect_select(image,
                                 x1+size,
                                 y1+size,
                                 (x2-x1)-(size*2),
                                 (y2-y1)-(size*2),
                                 CHANNEL_OP_SUBTRACT,
                                 False,
                                 0)
         elif selection_type == 'ellipse':
             pdb.gimp_ellipse_select(image,
                                     x1+size,
                                     y1+size,
                                     (x2-x1)-(size*2),
                                     (y2-y1)-(size*2),
                                     CHANNEL_OP_SUBTRACT,
                                     True,
                                     False,
                                     0)
     else:
         gimp.message("Please make a selection...")

def test_plugin(image, drawable):
     image.undo_group_start()

     # A rectangular selecion with default settings...
     create_border(image)

      # Ellipse with custom settings... Uncomment to activate
     #create_border(image, selection_type='ellipse', size=3)

     # Fill
     pdb.gimp_edit_fill(drawable, 0)
     pdb.gimp_selection_none(image)

     image.undo_group_end()

On 09/24/2010 06:18 PM, Jerry Baker wrote:
>    Calculating a new selection from the current selection would be faster
> (I think):
>
> def create_border(image, selection_type='rectangle', size=1):
>       is_selection, x1, y1, x2, y2 = pdb.gimp_selection_bounds(image)
>
>       if is_selection:
>           if size<  1:
>               size = 1
>           if selection_type =='rectangle':
>               pdb.gimp_rect_select(image, x1+size, y1+size,
> (x2-x1)-(size*2), (y2-y1)-(size*2), CHANNEL_OP_SUBTRACT, False, 0)
>           elif selection_type == 'ellipse':
>               pdb.gimp_ellipse_select(image, x1+size, y1+size,
> (x2-x1)-(size*2), (y2-y1)-(size*2), CHANNEL_OP_SUBTRACT, True, False, 0)
>       else:
>           gimp.message("Please make a selection...")
>
> def test_plugin(image, drawable):
>       image.undo_group_start()
>
>       create_border(image)    # A rectangular selecion with default
> settings...
>       #create_border(image, selection_type='ellipse', size=3)     # Or
> Ellipse with custom settings...
>
>       # Fill
>       pdb.gimp_edit_fill(drawable, 0)
>       pdb.gimp_selection_none(image)
>
>       image.undo_group_end()
>
> On 09/24/2010 10:19 AM, Ofnuts wrote:
>>     Hi,
>>
>> 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?
>>
>> Next improvement is to create a 3-pixels selection and feather it one
>> pixel. Anything to be wary of?
>>
>> --
>> Ofnuts
>>
>> _______________________________________________
>> Gimp-developer mailing list
>> Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
>> https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer
> _______________________________________________
> Gimp-developer mailing list
> Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
> https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer

_______________________________________________
Gimp-developer mailing list
Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer


[Index of Archives]     [Video For Linux]     [Photo]     [Yosemite News]     [gtk]     [GIMP for Windows]     [KDE]     [GEGL]     [Gimp's Home]     [Gimp on GUI]     [Gimp on Windows]     [Steve's Art]

  Powered by Linux