01-23-2018, 10:13 PM 
(This post was last modified: 01-23-2018, 10:23 PM by mich_lloid.)
	
	
	
		Ok, so I've been looking at sample scripts of jfmdev at "http://registry.gimp.org/node/28124"
very insteresting are scripts "test-discolour-layer-v3.py" which loops over pixels with arrays and "test-discolour-layer-v4.py" which loops over pixels with tiles.
Looping over pixels with array module:
20 seconds is pretty bad for looping over 1024x1024 image.
looping over pixels with tiles:
Wow, 0.21 seconds, looping over pixels with tiles is definitely the way to go.
Ok, so now my questions are:
1) How do I translate a tile's pixel position to it's layer's global pixel position so I can select it with "pdb.gimp_fuzzy_select(img.active_layer, <x_position_of_pixel>, <y_position_of_pixel>, 254.9 , 2,0,0, 0,0)" ?
2) How do I exit the loop, update the layer by clearing selection, update layer, and resume the loop from last tile?
f.e. I want to accomplishthese steps for a 1024x1024 image with 16x16 tiles:
-I find a non-transparent pixel at tile(3,4)
-I exit the tile loop
-select that pixel and neighboring non-transparent pixels with 'pdb.gimp_fuzzy_select'
-do some stuff
-update the layer
-and then resume tile loop at tile(3,4) until tile(16,16).
-script hopefully ends succesfully.
	
	
	
very insteresting are scripts "test-discolour-layer-v3.py" which loops over pixels with arrays and "test-discolour-layer-v4.py" which loops over pixels with tiles.
Looping over pixels with array module:
Code:
import time
import array
def loop_array():
   time_start = time.time()
   img = gimp.image_list()[0]
   layer = img.active_layer
   srcRgn = layer.get_pixel_rgn(0, 0, layer.width, layer.height, False, False)
   pixelSize = len(srcRgn[0,0])
   srcArray = array.array("B", srcRgn[0:layer.width, 0:layer.height])
   for y in range(layer.height):
       for x in range(layer.width):
           # Get the pixel
           pos = (x * layer.height + y) * pixelSize
           pixel = srcArray[pos], srcArray[pos+1], srcArray[pos+2], srcArray[pos+3]
   time_end = time.time()
   print ('time taken: ' + str(time_end - time_start) + ' seconds.')
loop_array()
➤> loop_array()
time taken: 20.2019999027 seconds.looping over pixels with tiles:
Code:
import time
def loop_tiles():
   time_start = time.time()
   img = gimp.image_list()[0]
   layer = img.active_layer
   tn = int(layer.width / 64)
   if(layer.width % 64 > 0):
       tn += 1
   tm = int(layer.height / 64)
   if(layer.height % 64 > 0):
       tm += 1
   for i in range(tn):
       for j in range(tm):
           srcTile = layer.get_tile(False, j, i)
           for x in range(srcTile.ewidth):
               for y in range(srcTile.eheight):
                   # Get the pixel
                   pixel = srcTile[x,y]
   print( ord( pixel[-1] ))
   time_end = time.time()
   print ('time taken: ' + str(time_end - time_start) + ' seconds.')
loop_tiles()
➤>time taken: 0.218999862671 seconds.Wow, 0.21 seconds, looping over pixels with tiles is definitely the way to go.
Ok, so now my questions are:
1) How do I translate a tile's pixel position to it's layer's global pixel position so I can select it with "pdb.gimp_fuzzy_select(img.active_layer, <x_position_of_pixel>, <y_position_of_pixel>, 254.9 , 2,0,0, 0,0)" ?
2) How do I exit the loop, update the layer by clearing selection, update layer, and resume the loop from last tile?
f.e. I want to accomplishthese steps for a 1024x1024 image with 16x16 tiles:
-I find a non-transparent pixel at tile(3,4)
-I exit the tile loop
-select that pixel and neighboring non-transparent pixels with 'pdb.gimp_fuzzy_select'
-do some stuff
-update the layer
-and then resume tile loop at tile(3,4) until tile(16,16).
-script hopefully ends succesfully.

 

 
