import re import os from datetime import datetime # My packages from utils.image_handler import ImageProcessor, ExifHandler class OPTIMA35: def __init__(self): self.name = "OPTIMA-35" self.version = "0.4.0" #self.utilities = Utilities() self.image_processor = ImageProcessor() self.exif_handler = ExifHandler() self.settings = { "input_folder": None, "output_folder": None, "file_format": None, "resize": False, "contrast": False, "brightness": False, "new_file_names": False, "invert_image_order": False, "copy_exif": False, "own_exif": False, "watermark": False, "grayscale": False, "jpg_quality": None, "png_compression": None, "font_size": None, "optimize": False, "gps": False } self.selected_exif = {} def modify_timestamp_in_exif(self, exif_data, filename): """"Takes exif data and adjust time to fit ending of filename.""" try: last_tree = filename[-3:len(filename)] total_seconds = int(re.sub(r'\D+', '', last_tree)) minutes = total_seconds // 60 seconds = total_seconds % 60 time = datetime.strptime(exif_data["date_time_original"], "%Y:%m:%d %H:%M:%S") # change date time string back to an time object for modification new_time = time.replace(hour=12, minute=minutes, second=seconds) exif_data["date_time_original"] = new_time.strftime("%Y:%m:%d %H:%M:%S") return exif_data except ValueError: print("Modifying date went wrong, exiting...") exit() def process(self, image_input_file, image_output_file): with self.image_processor.open_image(image_input_file) as img: processed_img = img image_name = os.path.basename(image_output_file) if self.settings["resize"] != False: processed_img = self.image_processor.resize_image( image = processed_img, percent = self.settings["resize"] ) if self.settings["watermark"] != False: processed_img = self.image_processor.add_watermark(processed_img, self.settings["watermark"], int(self.settings["font_size"])) if self.settings["grayscale"] != False: # There is a problem, if we first to grayscale and then watermark it braeks processed_img = self.image_processor.grayscale(processed_img) if self.settings["brightness"] != False: # Does the order of brightness and contrast matter? processed_img = self.image_processor.change_brightness(processed_img, self.settings["brightness"]) if self.settings["contrast"] != False: # Does the order of brightness and contrast matter? processed_img = self.image_processor.change_contrast(processed_img, self.settings["contrast"]) if self.settings["own_exif"] != False: selected_exif = self.selected_exif if "date_time_original" in self.selected_exif: selected_exif = self.modify_timestamp_in_exif(selected_exif, image_name) exif_data = self.exif_handler.build_exif_dict(selected_exif, self.image_processor.get_image_size(processed_img)) if self.settings["gps"] != False: latitude = float(self.settings["gps"][0]) longitude = float(self.settings["gps"][1]) exif_data = self.exif_handler.add_geolocation_to_exif(exif_data, latitude, longitude) elif self.settings["copy_exif"] == True: # When copying exif from original, make sure to change Piexel X & Y Dimension to fit new size try: og_exif = self.exif_handler.get_exif_info(img) og_exif["Exif"][40962], og_exif["Exif"][40963] = self.image_processor.get_image_size(processed_img) exif_data = og_exif except Exception: # If an error happends it is because the picture does not have exif data print("Copying EXIF data selected, but no EXIF data is available in the original image file.") exif_data = None elif self.settings["copy_exif"] == False: exif_data = None self.image_processor.save_image( image = processed_img, path = image_output_file, exif_data = exif_data, file_type = self.settings["file_format"], jpg_quality = self.settings["jpg_quality"], png_compressing = self.settings["png_compression"], optimize = self.settings["optimize"] ) def name_images(self, base_name, current_image, total_images, invert): """"Returns name, combination of base_name and ending number.""" total_digits = len(str(total_images)) if invert: ending_number = total_images - (current_image - 1) else: ending_number = current_image ending = f"{ending_number:0{total_digits}}" return f"{base_name}_{ending}" if __name__ == "__main__": print("Please load OPTIMA35 into the ui class...") exit()