Files
pyimgview/pyimgview.py

152 lines
4.6 KiB
Python

#! /usr/bin/env python
"""
Copyright (c) 2016, Miguel Angel Astor Romero
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted according to the terms in the LICENSE file.
-------------------------------------------------------------------------
Execute as 'pyimgview.py IMAGE'. Use the arrow keys to change between
the images in the working directory. Quit with the esc key.
"""
import sys
import os
import pygame
import pygame.image as pyimg
import pygame.transform as pytrans
SCREEN_SIZE = (640, 480)
TITLE = "Image Viewer"
FPS = 60
def read_img(path):
""" Attempts to load the file found in path as an image.
returns None on failure, or a Pygame surface on success. """
try:
# Load the image.
img = pyimg.load(path)
w, h = img.get_size()
# Resize the image to fit the screen.
if w >= h:
sf = 0
if SCREEN_SIZE[0] < w:
sf = float(SCREEN_SIZE[0]) / float(w)
else:
sf = float(w) / float(SCREEN_SIZE[0])
img = pytrans.scale(img, (SCREEN_SIZE[0], int(float(h) * sf)))
else:
if SCREEN_SIZE[1] < h:
sf = float(SCREEN_SIZE[1]) / float(h)
else:
sf = float(h) / float(SCREEN_SIZE[1])
img = pytrans.scale(img, (int(float(w) * sf), SCREEN_SIZE[1]))
except Exception as e:
print e
print "Error: could not load " + path + ". It may not be a valid image file."
return None
else:
return img
def main():
""" Main game loop. """
global SCREEN_SIZE
# Check command line arguments and if the input file exists.
if len(sys.argv) < 2:
print "Usage: " + sys.argv[0] + " IMAGE"
return
if not os.access(sys.argv[1], os.R_OK):
print "Error: image file " + sys.argv[1] + " cannot be opened for reading."
return
# Get a list of all the files in the current working directory.
d, f = os.path.split(sys.argv[1])
d = os.getcwd() if d == '' else d
files = sorted(os.listdir(d))
img_ind = files.index(f)
# Read the image and get it's dimensions.
img = read_img(sys.argv[1])
if img is None:
return
w, h = img.get_size()
pos = ((SCREEN_SIZE[0] - w) / 2, (SCREEN_SIZE[1] - h) / 2)
# Initialize Pygame.
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode(SCREEN_SIZE)
pygame.mouse.set_visible(False)
done = False
# Main game loop.
try:
while(not done):
fps = clock.get_fps() + 0.001
pygame.display.set_caption(TITLE + ": " + f)
# Render cycle.
screen.fill((0, 0, 0))
screen.blit(img, pos)
pygame.display.update()
clock.tick(FPS)
# Input capture.
event = pygame.event.wait()
if (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE) or event.type == pygame.QUIT:
# Quit on escape key.
done = True
elif (event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT):
# Load the next image on right arrow key.
# Try with all following files until an image is found, wich may be
# the same one that is already loaded.
img = None
while img is None:
img_ind = (img_ind + 1) % len(files)
f = files[img_ind]
path = os.path.join(d, f)
img = read_img(path)
# Get the image dimensions.
w, h = img.get_size()
pos = ((SCREEN_SIZE[0] - w) / 2, (SCREEN_SIZE[1] - h) / 2)
elif (event.type == pygame.KEYDOWN and event.key == pygame.K_LEFT):
# Load the previous image on left arrow key.
# Try with all previous files until an image is found, wich may be
# the same one that is already loaded.
img = None
while img is None:
img_ind -= 1
if img_ind < 0:
img_ind = len(files) - 1
f = files[img_ind]
path = os.path.join(d, f)
img = read_img(path)
# Get the image dimensions.
w, h = img.get_size()
pos = ((SCREEN_SIZE[0] - w) / 2, (SCREEN_SIZE[1] - h) / 2)
except Exception:
pass
pygame.quit()
if __name__ == "__main__":
main()