Implémentons un cadre photo avec Raspeye. Le cadre photo est un thème utilisé dans Razzpie ~~ nième décoction ~~, mais je n'étais pas satisfait du thème conventionnel.
Après tout, une sélection rigoureuse des photos peut être un problème. Par exemple, lors de l'affichage de photos envoyées par un ami ou de photos d'un appareil photo dans un cadre photo
・ Si vous sélectionnez et insérez avec soin, ce sera difficile ou le nombre de feuilles sera petit et vous serez bientôt fatigué de le voir ・ Au contraire, si vous insérez tout, des photos erronées seront prises et une photo embarrassante sera affichée.
Il y a un dilemme. Pour résoudre ce problème, nous allons créer un cadre photo qui optimise l'affichage des photos.
Quand l'utilisateur aime ・ Passer la photo ・ Réduisez la fréquence d'affichage de la photo ・ Ne plus afficher la photo
Vous pouvez effectuer l'opération. La fréquence d'affichage ainsi réglée est enregistrée et mise à jour. En d'autres termes, le concept est de mettre toutes les photos et de les ajuster au fur et à mesure que vous les utilisez.
L'ensemble du code source est affiché en bas de page.
· Tarte aux framboises Cette fois, j'ai utilisé le Razpai 3 modèle B que j'avais chez moi. Toute génération est acceptable.
・ Écran 3,5 pouces Utilisé pour afficher des photos. Si j'achète environ 2000 yens sur Amazon, le pilote est ancien et ne peut pas être utilisé ... Lorsqu'un pilote fabriqué par une autre société est installé, seul l'écran s'affiche, mais le panneau tactile est mort.
Si vous souhaitez simplement afficher des photos
fbi image.jpg
C'est assez. Cependant, compte tenu de la réalisation de spécifications détaillées et de l'évolutivité telles que la coopération avec l'extérieur, j'écrirai tout en python cette fois. Si vous manipulez des images, OpenCV etc. est majeur, mais cette fois nous utiliserons pygame qui est un module pour les jeux.
Quant à cette spécification ① Acquérir automatiquement des images de DropBox (non implémenté) ② Afficher les images au format diaporama ③ Utilisez les boutons pour sauter des images, réduire la fréquence d'affichage, ne jamais les afficher, etc. ④ Enregistrez et mettez à jour la fréquence ajustée ça ira. Je sélectionne principalement pygame pour ③.
fabrication
Pour afficher l'image, vous devez commencer par créer une fenêtre.
import pygame
from pygame.locals import *
import sys
pygame.init()
screen =pygame.display.set_mode((400,300))
pygame.mouse.set_visible(False)
pygame.display.set_caption("Photo")
Initialisez avec pygame.init ()
et
Spécifiez la taille de l'écran avec display.set_mode ()
.
(Il sera en plein écran en insérant FULL SCREEN
comme argument, mais il semble préférable de ne pas le faire pendant le débogage car il sera difficile de terminer s'il y a un bogue en plein écran.)
Il est gênant d'avoir un curseur de souris comme cadre photo, alors supprimez-le avec pygame.mouse.set_visible (False)
.
img =pygame.image.load("file.jpg ")
img = pygame.transform.scale(img1,(400,300))
rectimg = img.get_rect()
screen.fill((0,0,0))
screen.blit(img,rect_img)
pygame.display.update()
Il s'agit de la partie représentation de l'image.
Vous pouvez charger une image avec ʻimage.load. Spécifiez la couleur d'arrière-plan RVB avec
screen.fill. Cette fois, c'est noir. Collez l'image avec
screen.blit et mettez à jour et affichez l'écran avec le dernier
display.update ()`.
L'image peut être affichée par l'opération ci-dessus. Maintenant, implémentons le diaporama.
Qu'est-ce qu'un diaporama? ・ Mesurer le temps ・ Charger et afficher une nouvelle image après un laps de temps
Voilà le processus. Par conséquent, enregistrez l'heure d'affichage de l'image.
start_time = pygame.time.get_ticks()
Et en tournant la boucle de while (1)
time_since_start = pygame.time.get_ticks() - start_time
if time_since_start>10000:
break
Cela peut être réalisé par.
Vous pouvez obtenir l'heure avec pygame.time.get_ticks ()
et l'unité est la ms, donc dans cet exemple, elle changera toutes les 10 secondes. (En fait, le temps de chargement de la photo est ajouté.)
Vous permet de changer sans attendre 10 secondes. Plus précisément, c'est une fonction pour afficher l'image suivante lorsque le bouton est enfoncé. Comme il n'y avait pas de bouton physique facile cette fois, je vais me connecter et utiliser un clavier.
De plus, la fonction pour y mettre fin ne peut pas être exécutée telle quelle. Par conséquent, lorsque vous appuyez sur ESC, le programme se termine.
for event in pygame.event.get():
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
sys.exit()
if event.key == K_z:
flugloop = False
Tout d'abord, l'événement qui s'est produit est extrait dans une boucle, et s'il s'agit d'une pression sur une touche, le processus est exécuté. K_ESCAPE est la touche ESC et K_z est la touche z. De cette façon, vous pouvez implémenter le comportement lorsqu'une touche est enfoncée avec K_a etc.
S'il s'agit de la touche ESC, elle se terminera immédiatement par l'instruction if, si la touche z est enfoncée, l'indicateur de saut sera défini et l'image suivante sera déplacée vers.
Maintenant que vous disposez d'un diaporama, vous pouvez ajouter un traitement pour les photos que vous souhaitez afficher moins fréquemment ou que vous ne souhaitez pas revoir. Dans [Afficher l'image](#Display image), le chemin a été spécifié et lu. La partie lue est pondérée et modifiée aléatoirement.
photonum = list(range(1,len(w)+1))
filenum = random.choices(photonum,weight)
filename = str(filenum[0]) + ".jpg "
pygame.image.load(filename)
Nommez l'image 1.jpg, 2.jpg, etc. à l'avance.
Ici, la deuxième ligne «random.choices» est la fonction à sélectionner par pondération aléatoire.
photonum
est une liste contenant 1 au nombre de feuilles
«weight» contient le poids de chaque image sous forme de valeur entière.
En passant ces deux à "random.choices", il choisira parmi "photonum" en fonction de son poids.
Ensuite, le fichier image sélectionné est chargé.
Tout ce que vous avez à faire est d'utiliser ce "poids".
Cette fois, enregistrez "weight" dans un fichier texte séparé par des sauts de ligne. De plus, la valeur initiale du poids est une valeur entière de 10.
data = open('data.txt')
weight =[]
for line in data:
weight.append(int(line))
data.close()
Cela lira les poids ligne par ligne de data.txt
et les stockera dans weight
.
Maintenant, en utilisant le KEYDOWN sorti plus tôt,
if event.key == K_x:
flugloop =False
weight[filenum-1] = 0
Si tel est le cas, le poids sera réglé sur 0 lorsque vous appuyez sur x et la photo ne sera plus jamais affichée. Une décrémentation de la même manière réduira la fréquence d'affichage de la photo.
Eh bien, cette liste sera bien sûr perdue une fois terminée. Alors sauvegardons-le en l'écrivant dans data.txt
.
Ajoutez au comportement de la touche ESC.
if event.key == K_ESCAPE
f = open("data.txt",'w')
for i in weight:
f.write(str(i))
f.write("\n")
f.close()
pygame.quit()
sys.exit()
En faisant cela, les paramètres seront hérités au prochain démarrage.
#photo.py
import pygame
from pygame.locals import *
import sys
import random
def get_image(w=[]):
photonum = list(range(1,len(w)+1))
filenum = random.choices(photonum,w) #Extraire des images au hasard
filename = str(filenum[0]) + ".jpg "
return pygame.image.load(filename).convert_alpha(),filenum[0] #La valeur de retour est l'image et son ID
def main():
data = open('data.txt') #Poids de chargement
weight =[]
for line in data:
weight.append(int(line))
data.close()
while(1):#Afficher une image
pygame.init()
screen =pygame.display.set_mode((400,300),FULLSCREEN)
pygame.mouse.set_visible(0)
pygame.display.set_caption("test")
x=get_image(weight)
img1 = x[0]
filenum = x[1]
img2 = pygame.transform.scale(img1,(400,300))
rect_img2 = img2.get_rect()
screen.fill((0,0,0))
screen.blit(img2,rect_img2) #Affichage de l'image
pygame.display.update() #Mise à jour de l'écran
start_time = pygame.time.get_ticks() #Mesure de l'heure de début
flugloop = True
while(1): #Boucle pour accepter les opérations
time_since_start = pygame.time.get_ticks() - start_time #Mesure du temps
if time_since_start>10000: #Pause après 10 secondes,Vers l'affichage d'image suivant
break
if flugloop ==False: #Pause si signalé,Vers l'affichage d'image suivant
break
for event in pygame.event.get(): #Réception d'opération
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE: #Lorsque esc est pressé
f = open("data.txt",'w') #Enregistrer la fréquence d'affichage
for i in weight:
f.write(str(i))
f.write("\n")
f.close()
pygame.quit() #La fin du programme
sys.exit()
if event.key == K_SPACE: #Lorsque vous appuyez sur la touche espace, réduisez le poids et passez à l'image suivante
flugloop = False
if weight[filenum-1] >3:
weight[filenum-1] -=1
if event.key == K_x: #Lorsque vous appuyez sur la touche x, le poids est mis à 0 et ne s'affiche plus jamais.
flugloop =False
weight[filenum-1] = 0
if event.key == K_z:
flugloop =False
main()
Implémentation de l'ajout automatique de photos depuis DropBox. Installation de boutons physiques. Si vous utilisez une webcam pour augmenter le poids des photos auxquelles vous faites très attention et bien les afficher, il sera plus facile d'ajuster le poids de la fréquence d'affichage.
Recommended Posts