Ejemplo n.º 1
0
def slice(image, drawable, image_path, image_basename, image_extension, left,
          right, top, bottom, i, j, postfix):
    if postfix:
        postfix = "_" + postfix
    src = "%s_%d_%d%s.%s" % (image_basename, i, j, postfix, image_extension)
    filename = os.path.join(image_path, src)

    if not drawable:
        temp_image = image.duplicate()
        temp_drawable = temp_image.get_active_layer()
    else:
        if image.base_type() == Gimp.ImageBaseType.INDEXED:
            #gimp_layer_new_from_drawable doesn't work for indexed images.
            #(no colormap on new images)
            original_active = image.get_active_layer()
            image.active_layer = drawable
            temp_image = image.duplicate()
            temp_drawable = temp_image.get_active_layer()
            image.active_layer = original_active
            temp_image.undo_disable()
            #remove all layers but the intended one
            while len(temp_image.layers) > 1:
                if temp_image.layers[0] != temp_drawable:
                    temp_image.remove_layer(temp_image.layers[0])
                else:
                    temp_image.remove_layer(temp_image.layers[1])
        else:
            temp_image = Gimp.image_new(drawable.width(), drawable.height(),
                                        image.base_type())
            temp_drawable = Gimp.layer_new_from_drawable(drawable, temp_image)
            temp_image.insert_layer(temp_drawable)

    temp_image.undo_disable()
    temp_image.crop(right - left, bottom - top, left, top)
    if image_extension == "gif" and image.base_type(
    ) == Gimp.ImageBaseType.RGB:
        temp_image.convert_indexed(Gimp.ConvertDitherType.NONE,
                                   Gimp.ConvertPaletteType.GENERATE, 255, True,
                                   False, "")
    if image_extension == "jpg" and image.base_type(
    ) == Gimp.ImageBaseType.INDEXED:
        temp_image.convert_rgb()

    Gimp.file_save(Gimp.RunMode.NONINTERACTIVE, temp_image, temp_drawable,
                   Gio.file_new_for_path(filename))

    temp_image.delete()
    return src
Ejemplo n.º 2
0
def benchmark(procedure, args, data):
    if args.length() != 3:
        error = 'Wrong parameters given'
        return procedure.new_return_values(Gimp.PDBStatusType.CALLING_ERROR,
                                           GLib.Error(error))
    run_mode = args.index(0)
    folder = args.index(1)
    save_output = args.index(2)

    folder = os.path.abspath(os.path.expanduser(folder))
    if not os.path.exists(folder):
        error = "Folder '" + folder + "' doesn't exist.\n"
        return procedure.new_return_values(Gimp.PDBStatusType.CALLING_ERROR,
                                           GLib.Error(error))

    total_unclassified = 0
    total_misclassified = 0
    total_time = 0.0

    images = os.path.join(folder, "images")
    for name in os.listdir(images):

        try:
            image_display.delete()
            mask_display.delete()
        except NameError:
            pass

        image_name = os.path.join(images, name)

        # Remove suffix, assuming it has three characters
        name = re.sub(r'\....$', '', name)

        mask_name = os.path.join(folder, "cm_bmp", name + '.png')
        truth_name = os.path.join(folder, "truth", name + '.bmp')

        image = Gimp.file_load(run_mode, Gio.file_new_for_path(image_name))
        image_layer = image.get_active_layer()

        mask = Gimp.file_load(run_mode, Gio.file_new_for_path(mask_name))
        convert_grayscale(mask)
        mask_layer = mask.get_active_layer()

        truth = Gimp.file_load(run_mode, Gio.file_new_for_path(truth_name))
        convert_grayscale(truth)
        truth_layer = truth.get_active_layer()

        unclassified = unclassified_pixels(mask_layer, truth_layer)

        sys.stderr.write(os.path.basename(image_name))

        start = time.time()
        image_layer.foreground_extract(Gimp.ForegroundExtractMode.MATTING,
                                       mask_layer)
        end = time.time()

        sys.stderr.write(" ")

        # This line was in the gimp 2 implementation, and probably isn't needed anymore.
        #  mask_layer.flush ()

        # Ignore errors when creating image displays;
        # allows us to be used without a display.
        try:
            image_display = Gimp.Display.new(image)
            mask_display = Gimp.Display.new(mask)

            Gimp.displays_flush()
            time.sleep(1.0)
        except:
            pass

        image.delete()

        misclassified = misclassified_pixels(mask_layer, truth_layer)

        sys.stderr.write("%d %d %.2f%% %.3fs\n" %
                         (unclassified, misclassified,
                          (misclassified * 100.0 / unclassified), end - start))

        total_unclassified += unclassified
        total_misclassified += misclassified
        total_time += end - start

        truth.delete()

        if save_output:
            filename = os.path.join(folder, "output", name + '.png')
            Gimp.file_save(Gimp.RunMode.NONINTERACTIVE, mask, mask_layer,
                           Gio.file_new_for_path(filename))

        mask.delete()

    # for loop ends

    try:
        image_display.delete()
        mask_display.delete()
    except NameError:
        pass

    sys.stderr.write(
        "Total: %d %d %.2f%% %.3fs\n" %
        (total_unclassified, total_misclassified,
         (total_misclassified * 100.0 / total_unclassified), total_time))

    return procedure.new_return_values(Gimp.PDBStatusType.SUCCESS,
                                       GLib.Error())