Init
This commit is contained in:
commit
0bad934258
|
@ -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.
|
||||
|
|
@ -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()
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue