Programmation python, renvoyer une défition

Bonjour a tous ,

je me permet de vous demander votre aide pour une petit souci que je rencontre dans ma programmation. Que vous trouverez ci dessous

Voici les deux choses que je n’arrive pas à mettre en place .

  1. Après l’affichage de la photo prise , attendre d’appuyer sur ,soit le bouton gpio N20 , qui relancerait la def play ( on repartirait sur la séquence complète pour prendre une photo )
    soit appuyer sur le bouton n21 qui lancerait l’impression .

  2. le petit soucis que je n’arrive pas à régler c’est la taille d’affichage de la photo . En gros quand l’affichage se fait, ma photo est comme " zoomé "
    Ex: si je fait une photo de moi debout , à l’affichage ça me mettra que le haut de mon corps . Ça fait quelque heure que je planche dessus mais je bug complètement

import picamera
import itertools
import subprocess
import os
from shutil import copyfile
import sys
import time
from datetime import datetime
import logging
import RPi.GPIO as GPIO
from PIL import Image, ImageDraw, ImageFont
import pygame

LARGEUR_ECRAN = 1280
HAUTEUR_ECRAN = 960
LARGEUR_PHOTO = 1280
HAUTEUR_PHOTO = 960
CurrentWorkingDir= « /home/pi/Photomaton_Prev/ »
archiveDir = « /home/pi/Pictures/ »
PHOTO_DELAY = 5 #délai en secondes avant prise de la photo
overlay_renderer = None
buttonEvent = False

pygame.init()
#screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)
screen = pygame.display.set_mode((790, 530))
width, height = screen.get_size()

GPIO.setmode(GPIO.BCM)
GPIO.setup(16, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(20, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#Supprimer les pré-images (on ne les garde que dans le dossier du bureau)
def deleteImages(fileName):
logging.info(« Suppression des anciennes images. »)
if os.path.isfile(fileName):
os.remove(fileName);

def cleanUp():
GPIO.cleanup()

def archiveImage(fileName):
logging.info(« Sauvegarde de l’image : « +fileName)
copyfile(fileName,archiveDir+ »/ »+fileName)

def countdownFrom(secondsStr):
secondsNum = int(secondsStr)
if secondsNum >= 0 :
while secondsNum > 0 :
addPreviewOverlay(300,100,200,str(secondsNum))
time.sleep(1)
secondsNum=secondsNum-1

def precapture1(imageName):
addPreviewOverlay(150,200,100,"–> Photo dans 5 secondes ! :-)")

def precapture2(imageName):
addPreviewOverlay(150,200,100,"–> Souriez !!!")

def captureImage(imageName):
addPreviewOverlay(150,200,100,"–> Merci ! :-)")
#Sauvegarde de l’image
camera.capture(imageName, resize=(3280, 2464))
print(« Image « +imageName+ » enregistrée. »)

def addPreviewOverlay(xcoord,ycoord,fontSize,overlayText):
global overlay_renderer
img = Image.new(« RGBA », (LARGEUR_ECRAN, HAUTEUR_ECRAN))
draw = ImageDraw.Draw(img)
draw.font = ImageFont.truetype(
« /usr/share/fonts/truetype/freefont/FreeSerif.ttf »,fontSize)
draw.text((xcoord,ycoord), overlayText, (255, 20, 147))

if not overlay_renderer:
    overlay_renderer = camera.add_overlay(img.tobytes(),
                                          layer=3,
                                          size=img.size,
                                          alpha=128);
else:
    overlay_renderer.update(img.tobytes())

def play():
print(« Démarrage de la séquence ‹ 1 photo › »)

initCamera(camera)
print("Démarrage de l'aperçu")
camera.start_preview()
    
fileName = time.strftime("%Y%m%d-%H%M%S")+".jpg"
fileName_Miroir = time.strftime("%Y%m%d-%H%M%S")+"_Miroir.jpg"
print("Nom de fichier créé : "+fileName)

precapture1(fileName)
time.sleep(2)
countdownFrom(PHOTO_DELAY)
precapture2(fileName)
time.sleep(2)
captureImage(fileName)
time.sleep(1)


archiveImage(fileName)

deleteImages(fileName)

camera.stop_preview()

AfficherPhoto("/home/pi/Pictures/" + "/" + fileName)
addPreviewOverlay(150,200,100,"--> Joli ;-)")
time.sleep(3)

AfficherPhoto("/home/pi/Photomaton_Prev/accueil1.jpg")
addPreviewOverlay(20,200,55,"--> Appuyez sur le bouton Rouge")

os.system('lpr -h -PSamsung_Samsung_CLX-3300_Series -#1 -o media=A4 -o scaling=25 "/home/pi/Desktop/Photos_du_Photomaton/'+fileName+'"')
time.sleep(15)
print("Travail d'impression créé avec succès.")

def initCamera(camera):
#camera settings
camera.resolution = 2500, 2300
camera.framerate = 24
camera.sharpness = 0
camera.contrast = 0
camera.brightness = 50
camera.saturation = 0
camera.ISO = 0
camera.video_stabilization = False
camera.exposure_compensation = 0
camera.exposure_mode = ‹ auto ›
camera.meter_mode = ‹ average ›
camera.awb_mode = ‹ auto ›
camera.image_effect = ‹ none ›
camera.color_effects = None
camera.rotation = 0
camera.hflip = False
camera.vflip = False
camera.crop = (0.0, 0.0, 1.0, 1.0)

def onButtonPress():
print(« Demande faite pour 1 photo ! »)
play()
#reset the initial welcome message
addPreviewOverlay(20,200,55,"–> Appuyez sur le bouton Rouge")

def onButtonDePress():
print(« Bouton Rouge n’est plus pressé (donc, il a le temps ???) ;-) »)

def AfficherPhoto(fileName): # affiche NomPhoto
print("loading image: " + fileName)
background = pygame.image.load(fileName);
background.convert_alpha()
background = pygame.transform.scale(background,(790, 530))
screen.blit(background,(0, 0))
pygame.display.flip()

#Flux initial
with picamera.PiCamera() as camera:
os.chdir(CurrentWorkingDir)

try:
    addPreviewOverlay(20,200,55,"--> Appuyez sur le bouton Rouge")
    AfficherPhoto("/home/pi/Photomaton_Prev/accueil1.jpg")



    print("Démarrage de la boucle du programme")
    while True:
        input_state = GPIO.input(16)

        if input_state == False :
            if buttonEvent == False :
                buttonEvent = True
                onButtonPress()
        elif buttonEvent == True :
                buttonEvent = False
                onButtonDePress()
    

                
except BaseException:
    print("Heu ... Exception non gérée : " , exc_info=True)
    camera.close()
    cleanUp()
finally:
    print("Au revoir ...")
    cleanUp()
    camera.close()

Salut,

Déjà, je pense que tu n’as pas une imprimante Samsung CLX3300 ; va falloir changer cette partie du code :laughing:

Sinon, pour la partie 1 de ta demande :
Ça ne va pas être si simple.
Va falloir bcp plus d’heures de vol sur Python.
Perso, j’ai utilisé une technique de contournement car les conditions en cascades = pas si simple.

Pour la partie 2 :
Tu as modifié le script en ajoutant des dimensions caméra/images à plusieurs endroits alors que le script original comporte 2 jeux de dimensions passées en variable et réutilisées à divers endroits.
En gros, tu commandes un cadre de 50 cm x 30 cm alors que tu imprimes ta photo en 80 cm x 70 cm alors forcément … heu … ça déborde ! :stuck_out_tongue:
D’autant que tu colles des dimensions très exotiques et différentes entre elles à divers endroits ; ça ne peut pas coller.
Tu dois apprendre à retravailler un code en le comprenant un minimum car là, tu as collé un gros bazar.

Et pour info, le script d’origine fonctionne parfaitement.

++

@Nabla Je sais que le script fonctionne bien :wink: mais il ne rentre pas dans ce que je cherchee . D’où le changement. Pour l’imprimante effectivement je n’ai pas celle repris dans le script mais une professionnel. Mais n’étant pas encore a cette partie là je la laisse de côté.

Et comme je l’ai dit plus haut , j’ai pas de grosse notion en python. Donc me dire que j’ai foiré à t’elle endroit ça je me doute . Ce que je demande c’est qu’on me montre mes erreurs ( si je savais les voirs je n’aurais pas poster mon problème )

Yo @fr3d7

C’est ce que j’ai fait avec :

Mais je ne voulais pas corriger ; juste indiquer le type d’erreur (c’est comme ça qu’on progresse).

A part des heures à plancher dessus, je ne connais pas Python. Ce que j’ai « appris », c’est à force d’étudier des codes et les modifier.

Bon, du coup, pour être plus précis et plus aidant :
Puisque le script dit

LARGEUR_ECRAN = 1280
HAUTEUR_ECRAN = 960
LARGEUR_PHOTO = 1280
HAUTEUR_PHOTO = 960

Pourquoi modifies-tu les lignes
camera.capture(imageName, resize=(3280, 2464))
et
camera.resolution = 2500, 2300 ?

Tu ne dois pas mettre de valeurs ici mais laisser les appels vers les variables.
En plus,
(3280, 2464) --> ratio de 1,3311688
2500, 2300 --> ratio de 1,08
1280/960 --> ratio de 1,333333

A mon avis, tu reprends le script initial en le retéléchargeant sur le site et tu ne fais des essais que par modification de
LARGEUR_ECRAN = 1280
HAUTEUR_ECRAN = 960
LARGEUR_PHOTO = 1280
HAUTEUR_PHOTO = 960

Voir aussi quel écran tu utilises et quelle résolution est utilisée.
On peut forcer la résolution de sortie via le Rpi :
J’ai fait un photomaton pour un gars qui avait un écran 22 pouces 1920x1080 alors que j’utilise une vieille TV de récup en 1366x765 et mon image de Raspbian modifié (que je lui ai fournie) a parfaitement fonctionnée sur son Rpi car mes réglages étaient « fixés ».

@+