commit 0bad934258650f930b5953c0cdc422aaa32bfcf4 Author: Mal Date: Tue Sep 26 23:19:29 2023 +0200 Init diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..6e2cb33 --- /dev/null +++ b/Readme.md @@ -0,0 +1,9 @@ +# Image Tinder +This little software let you browse your image folder with left and right key. If you have a match +just press M and the image will be moved to your match folder. All the others will be moved to your +remain folder. The changes to your file system will be made after you press return and the program +will end. + +## Dependencies +You just need to install the python module `pygame`. All the other libs are native python. + diff --git a/imgtndr.py b/imgtndr.py new file mode 100644 index 0000000..ec92ee5 --- /dev/null +++ b/imgtndr.py @@ -0,0 +1,144 @@ +#!/usr/bin/env python3 + +import sys +import os +import pygame +import argparse +import shutil + + +class Image: + def __init__(self, path, filename): + self.image = pygame.image.load(path + filename) + self.path = path + self.filename = filename + + def fit(self, surface, screen_width, screen_height): + width = self.image.get_width() + height = self.image.get_height() + + delta_w = width - screen_width + delta_h = height - screen_height + + scale_w = 1 + + if delta_w > 0: + scale_w = screen_width / width + + scale_h = 1 + + if delta_h > 0: + scale_h = screen_height / height + + scale = min(scale_w, scale_h) + + return pygame.transform.scale_by(self.image, scale) + + def draw(self, surface): + image = self.fit(self.image, surface.get_width(), surface.get_height()) + + x = (surface.get_width() - image.get_width()) * 0.5 + y = surface.get_height() * 0.5 - image.get_height() * 0.5 + + surface.blit(image, (x, y)) + + +def load_image(index, images, screen): + screen.fill((0, 0, 0)) + images[index].draw(screen) + pygame.display.update() + + +def next_image(current_image, skip, images, screen): + if len(images) < 1: + screen.fill((0, 0, 0)) + pygame.display.update() + return + + index = (current_image + skip) % len(images) + + load_image(index, images, screen) + + return index + + +def sanitize_path(path): + if not path.endswith('/'): + path += '/' + + return path + + +def main(): + pygame.init() + + parser = argparse.ArgumentParser(prog='Image Tinder', description='Swipe through your images and press M if you have a match.') + parser.add_argument('image_path', help='The folder with your images') + parser.add_argument('target_path_match', help='The folder for your matched images') + parser.add_argument('target_path_remain', help='The folder for the remaining images') + + args = parser.parse_args() + path = sanitize_path(args.image_path) + path_matches = sanitize_path(args.target_path_match) + path_remain = sanitize_path(args.target_path_remain) + + if not os.path.isdir(args.target_path_match): + raise Exception('Match path %s does not exist!' % args.target_path_match) + + if not os.path.isdir(args.target_path_remain): + raise Exception('Remain path %s does not exist!' % args.target_path_remain) + + images = [] + matches = [] + + for file in os.listdir(args.image_path): + filepath = path + file + + if not filepath.lower().endswith('.jpg') and not filepath.lower().endswith('.jpeg'): + continue + + images.append(Image(path, file)) + + screen = pygame.display.set_mode(pygame.display.list_modes()[0], pygame.FULLSCREEN) + + current_image = 0 + + load_image(current_image, images, screen) + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return + + elif event.type == pygame.KEYDOWN: + match event.key: + case pygame.K_ESCAPE: + return + + case pygame.K_LEFT: + current_image = next_image(current_image, -1, images, screen) + + case pygame.K_RIGHT: + current_image = next_image(current_image, 1, images, screen) + + case pygame.K_m: + if len(images) > 0: + matches.append(images[current_image]) + images.pop(current_image) + current_image = next_image(current_image, 0, images, screen) + + case pygame.K_RETURN: + for m in matches: + shutil.move(m.path + m.filename, path_matches + m.filename) + + for i in images: + shutil.move(i.path + i.filename, path_remain + i.filename) + + return + + +if __name__ == '__main__': + main() + + +