This commit is contained in:
Mal 2023-09-26 23:19:29 +02:00
commit 0bad934258
2 changed files with 153 additions and 0 deletions

9
Readme.md Normal file
View File

@ -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.

144
imgtndr.py Normal file
View File

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