diff --git a/save-export-clean.py b/save-export-clean.py index e3d42ca..063634d 100755 --- a/save-export-clean.py +++ b/save-export-clean.py @@ -42,7 +42,10 @@ def python_export_clean(img, drawable) : img.filename = filename chooser.destroy() - pdb.gimp_file_save(img, drawable, filename, filename) + exportimg = pdb.gimp_image_duplicate(img) + layer = pdb.gimp_image_merge_visible_layers(exportimg, CLIP_TO_IMAGE) + + pdb.gimp_file_save(exportimg, layer, filename, filename) pdb.gimp_image_clean_all(img) def choose_likely_save_dir() : diff --git a/save-mod.py b/save-mod.py new file mode 100755 index 0000000..bc36ad6 --- /dev/null +++ b/save-mod.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2013 by Michael Schönitzer, Akkana Peck +# You may use and distribute this plug-in under the terms of the GPL v2 +# or, at your option, any later GPL version. + +from gimpfu import * +import gtk +import os +import collections +import re + +def python_savemod_clean(img, drawable) : + filename = img.filename + + # If the file has no filename yet, ask user + if not filename : + chooser = gtk.FileChooserDialog(title=None, + action=gtk.FILE_CHOOSER_ACTION_SAVE, + buttons=(gtk.STOCK_CANCEL, + gtk.RESPONSE_CANCEL, + gtk.STOCK_OPEN, + gtk.RESPONSE_OK)) + # Might want to set a current folder: + save_dir = choose_likely_save_dir() + if save_dir : + chooser.set_current_folder(save_dir) + + response = chooser.run() + if response != gtk.RESPONSE_OK: + return + + filename = chooser.get_filename() + img.filename = filename + chooser.destroy() + # Otherwise we appand a string to the filename + else: + # We don't want to save it in xcf format + if os.path.splitext(filename)[1] == ".xcf" : + filename = os.path.splitext(filename)[0] + ".png" + + filenamewoext = os.path.splitext(filename)[0] # filename without extension + filenameext = os.path.splitext(filename)[1] # filenameextension + # ToDo: Improve, so that mor than 9 versions are possible + # Add -mod-attachement to filename + if not re.search('-mod[0-9]?$' , filenamewoext): + filename = filenamewoext + "-mod" + filenameext + elif re.search('-mod$' , filenamewoext): + filename = filenamewoext + "2" + filenameext + # Increment number of the -mod-attachement + else: + num = int(filenamewoext[-1]) + 1 + filename = filenamewoext[0:-1] + str(num) + filenameext + + # We want to save all layers, + # so first duplicate the picture, then merge all layers + exportimg = pdb.gimp_image_duplicate(img) + layer = pdb.gimp_image_merge_visible_layers(exportimg, CLIP_TO_IMAGE) + + # save file and unset the 'unsaved'-flag + pdb.gimp_file_save(exportimg, layer, filename, filename) + pdb.gimp_image_clean_all(img) + img.filename = filename + +# Guess the save directory +def choose_likely_save_dir() : + counts = collections.Counter() + for img in gimp.image_list() : + if img.filename : + counts[os.path.dirname(img.filename)] += 1 + + try : + return counts.most_common(1)[0][0] + except : + return None + +register( + "python_fu_savemod_clean", + "Save current image with mod extension, then mark it clean.", + "Save current image with mod extension, then mark it clean.", + "Michael Schoenitzer, Akkana Peck", + "Michael Schoenitzer, Akkana Peck", + "2013", + "Save with -mod & clean", + "*", + [ + (PF_IMAGE, "image", "Input image", None), + (PF_DRAWABLE, "drawable", "Input drawable", None), + ], + [], + python_savemod_clean, + menu = "/File/Save/" +) + +main() + diff --git a/tripusm.py b/tripusm.py new file mode 100755 index 0000000..b9da733 --- /dev/null +++ b/tripusm.py @@ -0,0 +1,95 @@ +#!/usr/bin/env python + +# Performes tree times a unsharp-mask wiht diffrent stengths and sizes + +# Copyright 2015 by Michael F. Schoenitzer +# You may use and distribute this plug-in under the terms of the GPL v2 +# or, at your option, any later GPL version. + +from gimpfu import * +import gtk +import os +import collections + +class MyWindow(gtk.Dialog): + + def __init__(self, parent=None, filename="Filename.jpg"): + gtk.Dialog.__init__(self, "Triple USM", parent, 0, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OK, gtk.RESPONSE_OK)) + if not filename: + filename="Filename.jpg" + + table = gtk.Table(4,2, True) + + self.set_default_size(150, 100) + box = self.get_content_area() + box.set_homogeneous(False) + box.set_spacing(False) + box.add(table) + + self.size_label = gtk.Label("Size") + self.strength_label = gtk.Label("Strength") + + table.attach(self.size_label, 0,1,0,1) + table.attach(self.strength_label, 1, 2, 0, 1) + + size1 = gtk.Adjustment(value=10, lower=0, upper=100, step_incr=0.1, page_incr=0, page_size=0) + strength1 = gtk.Adjustment(value=0.20, lower=0, upper=100, step_incr=0.01, page_incr=0, page_size=0) + self.size1 = gtk.SpinButton(size1, digits=2) + self.strength1 = gtk.SpinButton(strength1, digits=2) + table.attach(self.size1, 0,1,1,2) + table.attach(self.strength1, 1,2,1,2) + + size2 = gtk.Adjustment(value=10, lower=0, upper=100, step_incr=0.1, page_incr=0, page_size=0) + strength2 = gtk.Adjustment(value=0.20, lower=0, upper=100, step_incr=0.01, page_incr=0, page_size=0) + self.size2 = gtk.SpinButton(size2, digits=2) + self.strength2 = gtk.SpinButton(strength2, digits=2) + self.size2.set_text("10") + self.strength2.set_text("0.20") + table.attach(self.size2, 0,1,2,3) + table.attach(self.strength2, 1,2,2,3) + + size3 = gtk.Adjustment(value=10, lower=0, upper=100, step_incr=0.1, page_incr=0, page_size=0) + strength3 = gtk.Adjustment(value=0.20, lower=0, upper=100, step_incr=0.01, page_incr=0, page_size=0) + self.size3 = gtk.SpinButton(size3, digits=2) + self.strength3 = gtk.SpinButton(strength3, digits=2) + self.size3.set_text("5") + self.strength3.set_text("0.20") + table.attach(self.size3, 0,1,3,4) + table.attach(self.strength3, 1,2,3,4) + + self.show_all() + + +def python_triple_usm(img, drawable) : + dialog = MyWindow(filename=os.path.basename(img.filename)) + response = dialog.run() + if response != gtk.RESPONSE_OK: + return + + + pdb.plug_in_unsharp_mask(img, drawable, dialog.size1.get_text(), dialog.strength1.get_text(), 0) + pdb.plug_in_unsharp_mask(img, drawable, dialog.size2.get_text(), dialog.strength2.get_text(), 0) + pdb.plug_in_unsharp_mask(img, drawable, dialog.size3.get_text(), dialog.strength3.get_text(), 0) + +register( + "python_fu_triple_usm", + "triple Unsharp mask", + "triple Unsharp mask", + "Michael Schoenitzer", + "Michael Schoenitzer", + "2015", + "TripleUSM", + "*", + [ + (PF_IMAGE, "image", "Input image", None), + (PF_DRAWABLE, "drawable", "Input drawable", None), + ], + [], + python_triple_usm, + menu = "/Filters/Enhance" +) + +main() + diff --git a/upload2commons.py b/upload2commons.py new file mode 100755 index 0000000..30050f8 --- /dev/null +++ b/upload2commons.py @@ -0,0 +1,190 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +# Copyright 2013 by Michael Schönitzer, other +# You may use and distribute this plug-in under the terms of the GPL v3 +# or, at your option, any later GPL version. +#ToDo: +#- 'progressbar' +#- Success-Dialog +#- remember Usr/Pw +#- i18n + +from gimpfu import * +import gtk +import os +import collections +import wikitools +import tempfile +import time + +DEFAULT_WIKITEXT = '''{{Information +|Description={{en|}} +{{de| }} +|Source= +|Date= +|Author= +|Permission= +|other_versions= +}} +''' +WIKI_URL = "https://commons.wikimedia.org/w/api.php" + +class MyWindow(gtk.Dialog): + + def __init__(self, parent=None, filename="Filename.jpg"): + gtk.Dialog.__init__(self, "Upload2Commons", parent, 0, + (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, + gtk.STOCK_OK, gtk.RESPONSE_OK)) + if not filename: + filename="Filename.jpg" + + table = gtk.Table(2,2, True) + + self.set_default_size(150, 100) + box = self.get_content_area() + box.set_homogeneous(False) + box.set_spacing(False) + box.add(table) + + self.usr_label = gtk.Label("User-Name:\t") + self.usr_entry = gtk.Entry() + table.attach(self.usr_label, 0,1,0,1) + table.attach(self.usr_entry, 1, 2, 0, 1) + + self.pw_label = gtk.Label("Password:\t") + self.pw_entry = gtk.Entry() + self.pw_entry.set_visibility(False) + table.attach(self.pw_label, 0,1,1,2) + table.attach(self.pw_entry, 1,2,1,2) + + self.filename_entry = gtk.Entry() + self.filename_entry.set_text(filename) + box.add(self.filename_entry) + + self.textview = gtk.TextView() + self.textbuffer = self.textview.get_buffer() + self.textview.set_wrap_mode(gtk.WRAP_WORD_CHAR) + self.textbuffer.set_text(DEFAULT_WIKITEXT) + box.add(self.textview) + + + self.license = gtk.combo_box_new_text() + self.license.append_text("{{self|GFDL|cc-by-sa-all|migration=redundant}}") + self.license.append_text("{{self|cc-by-sa-3.0}}") + self.license.append_text("{{self|Cc-zero}}") + self.license.append_text("{{cc-by-sa-3.0}}") + self.license.append_text("{{PD-old-100}}") + self.license.append_text("{{PD-old-70}}") + self.license.append_text("{{PD-Art}}") + box.add(self.license) + + self.cat_box = gtk.HBox() + self.cat_label = gtk.Label("Categories:\t") + self.category_entry = gtk.Entry() + self.cat_box.add(self.cat_label) + self.cat_box.add(self.category_entry) + box.add(self.cat_box) + + self.feedbackbox = gtk.HBox() + box.add(self.feedbackbox) + self.spinner = gtk.Spinner() + + self.show_all() + + def startspinner(self): + self.feedbackbox.add(self.spinner) + self.spinner.start() + + +def python_upload2commons(img, drawable) : + use_tempfile=False + + if pdb.gimp_image_is_dirty(img) or not img.filename: + ### save file in temporary file ### + use_tempfile=True + file = tempfile.mkstemp(prefix='gimp_upload2commons-', suffix=".jpg") + local_file_name = file[1] + fd = file[0] + exportimg = pdb.gimp_image_duplicate(img) + layer = pdb.gimp_image_merge_visible_layers(exportimg, CLIP_TO_IMAGE) + pdb.gimp_file_save(exportimg, layer, local_file_name, local_file_name) + else: + local_file_name = img.filename + + ### Open Dialog ### + dialog = MyWindow(filename=os.path.basename(img.filename)) + response = dialog.run() + if response != gtk.RESPONSE_OK: + return + + dialog.startspinner() + wiki_username = dialog.usr_entry.get_text() + wiki_password = dialog.pw_entry.get_text() + + if wiki_username == "" or wiki_password == "": + print("No ursername or password given") + return + + remote_file_name = dialog.filename_entry.get_text() + wikitext = dialog.textbuffer.get_text(dialog.textbuffer.get_bounds()[0], + dialog.textbuffer.get_bounds()[1]) + wikitext += "\n" + dialog.license.get_active_text() + "\n" + for cat in dialog.category_entry.get_text().split('|'): + wikitext += "\n[[Category:" + cat + "]]" + comment = "File uploaded from Gimp by upload2commons" + + print(wikitext) + #return ## For debugging! + + ### Upload ### + try: + wiki = wikitools.wiki.Wiki(WIKI_URL) + except: + print "Can not connect to wiki. Check the URL" + + try: + wiki.login(username=wiki_username,password=wiki_password) + except: + # TODO: GUI + print "Invalid Username or Password" + + exit + + image=open(local_file_name,"r") + picture=wikitools.wikifile.File(wiki=wiki, title=remote_file_name) + print("Uploading…") + #picture.upload(fileobj=image, comment=comment, ignorewarnings=True) + time.sleep(6) + print("Finished Uploading") + + page_name = "File:" + remote_file_name.replace(" ","_") + page = wikitools.Page(wiki, page_name, followRedir=True, watch=True) + #page.edit(text=wikitext) + + if use_tempfile: + os.close(fd) + os.remove(local_file_name) + + +### register Plugin ### +register( + "python_fu_upload2commons", + "Upload the Image to Wikimedia Commons.", + "Upload the Image to Wikimedia Commons.", + "Michael Schoenitzer", + "Michael Schoenitzer", + "2013", + "Upload to Commons", + "*", + [ + (PF_IMAGE, "image", "Input image", None), + (PF_DRAWABLE, "drawable", "Input drawable", None), + ], + [], + python_upload2commons, + menu = "/File/Save/" +) + +main() +