def existImage(): if self.pathfileImage in self.addedImages: image = self.addedImages[self.pathfileImage]['image'] if pdb.gimp_image_is_valid(image): return {'isOk': True, 'image': image} images = gimp.image_list() if len(images) == 0: return {'isOk': False, 'message': "Not exist images"} images_by_filename = [ item for item in images if item.filename == self.pathfileImage ] del images if len(images_by_filename) == 0: return { 'isOk': False, 'message': "Not exist image '{}'".format(self.pathfileImage) } image = images_by_filename[0] del images_by_filename if not pdb.gimp_image_is_valid(image): return { 'isOk': False, 'message': "Image '{}' is not valid".format(self.pathfileImage) } return {'isOk': True, 'image': image}
def png(image=None): if not image: image = gimp.image_list()[0] prefix = pdb.gimp_image_get_filename(image)[:-4] + "_" gimp.progress_init("Save frames as {}_*.png".format(prefix)) for (layer_index, layer) in enumerate(image.layers): try: filename = "{}{:02d}.png".format(prefix, int(layer.name)) except ValueError: filename = "{}{}.png".format(prefix, layer.name) pdb.file_png_save( image, layer, filename, None, True, # interlace 9, # compression True, # bkgd True, # gama True, # offs True, # phys True, # time ) gimp.progress_update(100 * (layer_index + 1) / len(image.layers)) gimp.message("All frames saved as {}_*.png".format(prefix))
def existImage(self): if self.addedImages.has_key(self.filename): image = self.addedImages[self.filename]['image'] if pdb.gimp_image_is_valid(image): return {'isOk': True, 'image': image} images = gimp.image_list() if len(images) == 0: return {'isOk': False, 'msg': "Not exist images"} images_by_filename = filter( lambda item: item.filename == self.filename, images) del images if len(images_by_filename) == 0: return { 'isOk': False, 'msg': "Not exist image '%s'" % self.filename } image = images_by_filename[0] del images_by_filename if not pdb.gimp_image_is_valid(image): return { 'isOk': False, 'msg': "Image '%s' is not valid" % self.filename } return {'isOk': True, 'image': image}
def add_alpha(image=None): if not image: image = gimp.image_list()[0] image_size = (image.width, image.height) for layer in image.layers: if not pdb.gimp_drawable_has_alpha(layer): layer.add_alpha() if layer.offsets != (0, 0) or (layer.width, layer.height) != image_size: pdb.gimp_layer_resize_to_image_size(layer)
def stack(target=None): for image in gimp.image_list(): pdb.gimp_selection_none(image) if image.layers: if not target: target = image elif image != target: for layer in image.layers: pdb.gimp_edit_cut(layer) floating = pdb.gimp_edit_paste(target.layers[0], True) pdb.gimp_floating_sel_to_layer(floating)
def set_layer_opacity(self, opacity): print "Setting layer opacity to {}".format(opacity) try: image = gimp.image_list()[0] layer = pdb.gimp_image_get_active_layer(image) value = opacity / float(9.0) if value > 100.0: layer.opacity = 100.0 else: layer.opacity = value except: print "ERROR"
def nobox(image=None): if not image: image = gimp.image_list()[0] pdb.gimp_context_set_sample_transparent(True) image_size = (image.width, image.height) for layer in image.layers: if not pdb.gimp_drawable_has_alpha(layer): layer.add_alpha() if layer.offsets != (0, 0) or (layer.width, layer.height) != image_size: pdb.gimp_layer_resize_to_image_size(layer) (xmax, ymax) = (image.width - 1, image.height - 1) for (x, y) in [(0, 0), (xmax, 0), (0, ymax), (xmax, ymax)]: _num_channels, pixel = pdb.gimp_drawable_get_pixel(layer, x, y) if all(p > 240 for p in pixel): pdb.gimp_image_select_contiguous_color(image, 2, layer, x, y) pdb.gimp_edit_clear(layer)
def mirror(image=None): if not image: image = gimp.image_list()[0] max_layer = 0 for layer in image.layers: try: if int(layer.name) > max_layer: max_layer = int(layer.name) except ValueError: pass layers_to_reverse = image.layers[1:] pdb.gimp_selection_none(image) for layer in layers_to_reverse: pdb.gimp_edit_copy(layer) floating = pdb.gimp_edit_paste(image.layers[0], True) pdb.gimp_floating_sel_to_layer(floating) max_layer += 1 floating.name = str(max_layer)
def down(image=None): if not image: image = gimp.image_list()[0] if not image.layers: return select_next = False selected = False for layer in image.layers: if select_next and not selected: layer.visible = True pdb.gimp_image_set_active_layer(image, layer) selected = True elif layer.visible: select_next = True layer.visible = False if not selected: layer = image.layers[0] layer.visible = True pdb.gimp_image_set_active_layer(image, layer)
def existImage(self): if self.pathfileImage in self.addedImages: image = self.addedImages[ self.pathfileImage ]['image'] if pdb.gimp_image_is_valid( image ): return { 'isOk': True, 'image': image } images = gimp.image_list() if len ( images ) == 0: return { 'isOk': False, 'message': "Not exist images" } images_by_filename = filter( lambda item: item.filename == self.pathfileImage, images ) del images if len ( images_by_filename ) == 0: return { 'isOk': False, 'message': "Not exist image '%s'" % self.pathfileImage } image = images_by_filename[0] del images_by_filename if not pdb.gimp_image_is_valid( image ): return { 'isOk': False, 'message': "Image '%s' is not valid" % self.pathfileImage } return { 'isOk': True, 'image': image }
def number(image=None): if not image: image = gimp.image_list()[0] highest = 0 unnumbered = 0 for layer in image.layers: try: n = int(layer.name) if n > highest: highest = n except ValueError: unnumbered += 1 v = highest + unnumbered for layer in image.layers: try: int(layer.name) except ValueError: layer.name = str(v) v -= 1
def gif(image=None, suffix=None, fps=24): if not image: image = gimp.image_list()[0] file_path = pdb.gimp_image_get_filename(image)[:-4] if suffix: file_path += "_" + suffix.strip() file_path += ".gif" ms = int(1000.0 / fps) temp_image = False try: gimp.progress_init( "Save animated GIF @ {} fps = {} ms/frame as {}".format( fps, ms, file_path)) if pdb.gimp_image_base_type(image) != 2: temp_image = True image = pdb.gimp_image_duplicate(image) pdb.gimp_image_convert_indexed( image, 0, # dither-type=CONVERT-DITHER-NONE 0, # palette-type=CONVERT-PALETTE-GENERATE 255, # num-cols False, # alpha-dither False, # remove-unused "" # palette ) gimp.progress_update(50) pdb.file_gif_save( image, image.layers[0], file_path, file_path, True, # interlace True, # loop ms, # default-delay 2 # default-dispose ) gimp.progress_update(100) gimp.message("Saved animated GIF @ {} fps = {} ms/frame as {}".format( fps, ms, file_path)) finally: if temp_image: pdb.gimp_image_delete(image)
def on_window_focus(self, widget, other): """ Update all timeline thumbnails. """ # I discovered that gimp has a delay to update when the image are closed, putting # a small delay here i make sure that my if will catch the lack of the image # and close fanim correctly. time.sleep(0.1) if not (self.image in gimp.image_list()): self.destroy(False) else: # fixing problem that happens after delete the last layer through gimp. # and closing when theres no layers at all. if not self.image.layers: self.destroy(False) else: if self.active >= len(self.image.layers): self.active = len(self.image.layers) - 1 self._scan_image_layers() self.on_goto(None, GIMP_ACTIVE)
def sort(image=None): if not image: image = gimp.image_list()[0] image_size = (image.width, image.height) for layer in image.layers: if layer.offsets != (0, 0) or (layer.width, layer.height) != image_size: pdb.gimp_layer_resize_to_image_size(layer) more = True while more: more = False for a, b in zip(image.layers, image.layers[1:]): move_down = False try: move_down = int(a.name) < int(b.name) except ValueError: move_down = a.name < b.name if move_down: pdb.gimp_image_lower_item(image, a) more = True break
def up(image=None): if not image: image = gimp.image_list()[0] if not image.layers: return selected = False select_layer = None for layer in image.layers: if layer.visible: if not selected and select_layer: select_layer.visible = True pdb.gimp_image_set_active_layer(image, select_layer) selected = True layer.visible = False else: layer.visible = False if not selected: select_layer = layer if not selected: select_layer.visible = True pdb.gimp_image_set_active_layer(image, select_layer)
def frame(image=None, name=None): if not image: image = gimp.image_list()[0] if isinstance(name, int): name = str(name) if name: for layer in image.layers: if layer.name == name: layer.visible = True pdb.gimp_image_set_active_layer(image, layer) else: layer.visible = False else: first = True for (layer_index, layer) in enumerate(image.layers): if first and (layer.visible or layer_index == len(image.layers) - 1): layer.visible = True pdb.gimp_image_set_active_layer(image, layer) first = False else: layer.visible = False
def showall(image=None): if not image: image = gimp.image_list()[0] for layer in image.layers: layer.visible = True
def renumber(image=None): if not image: image = gimp.image_list()[0] for (layer_index, layer) in enumerate(image.layers): layer.name = str(len(image.layers) - layer_index)
def sheet(image=None, cols=0): if not image: image = gimp.image_list()[0] if not cols: best = (1, 10000000) for cols in range(1, len(image.layers) + 1): rows = (len(image.layers) + (cols - 1)) // cols (sheet_width, sheet_height) = (cols * image.width, rows * image.height) sheet_aspect_ratio = sheet_width / sheet_height if sheet_width > sheet_height else sheet_height / sheet_width if sheet_aspect_ratio < best[1]: best = (cols, sheet_aspect_ratio) cols = best[0] file_path = "{}_sheet_{}_frames_{}_columns_{}x{}.png".format( pdb.gimp_image_get_filename(image)[:-4], len(image.layers), cols, image.width, image.height) gimp.progress_init("Save sheet as {}".format(file_path)) rows = (len(image.layers) + (cols - 1)) // cols sheet = pdb.gimp_image_new(image.width * cols, image.height * rows, 0) try: sheet_layer = pdb.gimp_layer_new( sheet, sheet.width, sheet.height, 1, # type = RGBA-IMAGE "sprite sheet", 100, # opacity = 100 % 0 # mode = LAYER-MODE-NORMAL-LEGACY ) pdb.gimp_image_insert_layer(sheet, sheet_layer, None, 0) (row, col) = (0, 0) for (layer_index, layer) in enumerate(image.layers): pdb.gimp_selection_none(image) pdb.gimp_layer_resize_to_image_size(layer) pdb.gimp_edit_copy(layer) floating = pdb.gimp_edit_paste(sheet_layer, True) (left, top) = floating.offsets pdb.gimp_layer_translate(floating, col * image.width - left, row * image.height - top) pdb.gimp_floating_sel_anchor(floating) col += 1 if col >= cols: col = 0 row += 1 gimp.progress_update(100 * (layer_index + 1) / len(image.layers)) pdb.file_png_save( sheet, sheet_layer, file_path, None, True, # interlace 9, # compression True, # bkgd True, # gama True, # offs True, # phys True, # time ) gimp.message("All frames saved as {}".format(file_path)) finally: pdb.gimp_image_delete(sheet)
def bc(image=None, brightness=0, contrast=50): if not image: image = gimp.image_list()[0] for layer in image.layers: pdb.gimp_drawable_brightness_contrast(layer, brightness / 100.0, contrast / 100.0)