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
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())