GIMP python线描非常慢

时间:2016-02-28 11:27:39

标签: python gimp gimpfu

pdb.gimp_paintbrush_default似乎非常慢(几秒钟,使用标准画笔为500点。线条更糟,显然)。这是这样的吗?使用用户选择的画笔绘制直线时,有没有办法加快速度?

pythonfu控制台代码:

from random import randint
img=gimp.image_list()[0]
drw = pdb.gimp_image_active_drawable(img)

width = pdb.gimp_image_width(img)
height = pdb.gimp_image_height(img)

point_number = 500
while (point_number > 0):
  x = randint(0, width)
  y = randint(0, height)
  pdb.gimp_paintbrush_default(drw,2,[x,y])
  point_number -= 1

1 个答案:

答案 0 :(得分:2)

我一直在做一些非常相似的事情并且也遇到了这个问题。这是我发现的一种技术,它使我的功能快了大约5倍:

  1. 创建临时图片
  2. 将您正在使用的图层复制到临时图像
  3. 在临时图层上绘图
  4. 复制原始图层顶部的临时图层
  5. 我相信这会加速,因为GIMP不必将编辑内容绘制到屏幕上,但我并不是100%肯定。这是我的职责:

    def splotches(img, layer, size, variability, quantity):
    
        gimp.context_push()
        img.undo_group_start()
    
        width = layer.width
        height = layer.height
    
        temp_img = pdb.gimp_image_new(width, height, img.base_type)
        temp_img.disable_undo()
    
        temp_layer = pdb.gimp_layer_new_from_drawable(layer, temp_img)
        temp_img.insert_layer(temp_layer)
    
        brush = pdb.gimp_brush_new("Splotch")
        pdb.gimp_brush_set_hardness(brush, 1.0)
        pdb.gimp_brush_set_shape(brush, BRUSH_GENERATED_CIRCLE)
        pdb.gimp_brush_set_spacing(brush, 1000)
        pdb.gimp_context_set_brush(brush)
    
        for i in range(quantity):
            random_size = size + random.randrange(variability)
    
            x = random.randrange(width)
            y = random.randrange(height)
    
            pdb.gimp_context_set_brush_size(random_size)
            pdb.gimp_paintbrush(temp_layer, 0.0, 2, [x, y, x, y], PAINT_CONSTANT, 0.0)
    
            gimp.progress_update(float(i) / float(quantity))
    
        temp_layer.flush()
        temp_layer.merge_shadow(True)
    
        # Delete the original layer and copy the new layer in its place
        new_layer = pdb.gimp_layer_new_from_drawable(temp_layer, img)
        name = layer.name
        img.remove_layer(layer)
        pdb.gimp_item_set_name(new_layer, name)
        img.insert_layer(new_layer)
    
        gimp.delete(temp_img)
    
        img.undo_group_end()
        gimp.context_pop()