Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 19/11/2009, à 11:29

renofr

Borne affichage images

Bonjour,

Je dois réaliser une borne qui affiche des images (jpeg) en plein écran, récupérées sur un serveur FTP. Le truc tout simple à priori :-)

J'ai donc installé Ubuntu 9.04 en version serveur (espace disque mini) + script bee pour environnemnent graphique. J'utilise feh pour afficher les images plein écran (excellent ce feh!).

Mais je dois vérifier toutes les 60 secondes si la(les) images situées le FTP ont changé ou si de nouvelles images ont été envoyées, d'où plusieurs pistes:

1) je créé une entrée dans la crontable qui tue et relance feh (avec options -F -D pour le diaporama)--> pas très propre il me semble.
2) j'écris un quelque chose qui devra afficher les images fullscreen avec une vérif du répertoire FTP toutes les 60 sec, mais là je ne sais pas quoi utliser, venant du monde Windows hmm : Python, bash avec appel à feh le tout géré par cron, etc... ?

Bref un peu perdu, merci pour un coup de main....

Dernière modification par renofr (Le 19/11/2009, à 11:32)

Hors ligne

#2 Le 19/11/2009, à 12:57

redo_fr

Re : Borne affichage images

Salut,

Le mieux est encore d'écrire ton propre programme smile
Voici un exemple de ce qui peut être fait en python (en utilisant l'excellent pygame)

#! /usr/bin/env python
#-*- coding:utf-8 -*-

# Controle de l'arrivee d'une nouvelle image (en secondes)
MAX_SEC_CHECK = 6

# resolution de l'image à l'ecran
RESOLUTION = [800,600]

# Plein ecran?
WANT_FULLSCREEN = True

# =======
# Imports
# =======
import sys
import os
import ftplib
import pygame
import time
from pygame.locals import *

# =======
# Classes
# =======

# =========
# Fonctions
# =========

def getFile(server, remote_file, login=None, password=None):
    try:
        ftp = ftplib.FTP(server) 
        if login is None and password is None:
            # Si le login et le password sont vides, on tente une connexion 'anonymous'
            ftp.login()
        else:
            ftp.login(login, password)

    except :
        print "Impossible d'ouvrir la connexion FTP"
        raise SystemExit

    # On recupere le nom du fichier
    local_file = remote_file.split('/')[-1]

    try:
        # On copie le fichier du serveur FTP vers /tmp
        ftp.retrbinary('RETR %s' % (remote_file, ), open('/tmp/%s' % (local_file, ), 'wb').write)
        return True
    except:
        return False


def checkNewImage(filename=None):
    if filename is not None:
        if getFile('ftp_server.exemple.org', filename, login='ftpuser', password='secret') is True:

            # Si la fonction getFile renvoie 'True', le fichier a ete recupere
            local_file = filename.split('/')[-1]
            if os.path.isfile('/tmp/%s' % (local_file, )):
                # On renvoie le chemin vers le fichier dans /tmp
                return '/tmp/%s' % (local_file, )
            else:
                return None

def load_image(fileName):
    try:
        # On charge l'image en la convertissant (plus rapide)
        image = pygame.image.load(fileName).convert()
    except pygame.error, message:
        print "Impossible de charger l'image :", fileName
        raise SystemExit, message

    return image

def runMain():
    global MAX_SEC_CHECK, RESOLUTION, WANT_FULLSCREEN
    try:
        pygame.init()
    except:
        print "Impossible de lancer pygame"
        sys.exit()

    if WANT_FULLSCREEN is True:
        screen = pygame.display.set_mode(RESOLUTION,pygame.FULLSCREEN)
    else:
        screen = pygame.display.set_mode(RESOLUTION)

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    horloge = 0
    while 1:
            for event in pygame.event.get():
                if event.type == QUIT:
                    return
                # On quitte le programme en appuyant sur la touche [Echap]
                elif event.type == KEYDOWN and event.key == K_ESCAPE:
                    return
            if horloge == 0 or int(time.clock()) - horloge >= MAX_SEC_CHECK:
                horloge = int(time.clock())
                
                # On indique le fichier image a recuperer
                im = checkNewImage('japet.jpg')

                if im is not None:
                    image = load_image(im)

                    # On "affiche" l'image en memoire cachée
                    screen.blit(image, (0, 0))

                    # On intervertit les memoires affichee et non affichee
                    pygame.display.flip()

# ==============
# Bloc principal
# ==============
if __name__ == '__main__':
    runMain()

# ================
# Fin du programme
# ================

# -------------------
# Reglages pour 'vim'
# vim:set autoindent expandtab tabstop=4 shiftwidth=4:

Amuses-toi bien!

Dernière modification par redo_fr (Le 19/11/2009, à 15:46)


Il n'y a pas de mauvais outils, il n'y a que de mauvais ouvriers
- papy -
Personnellement, je crois que faire des procès est un signe que les affaires vont mal. Je ne dis pas que Microsoft va mal, ce n'est qu'un signe, pas un indicateur...
- Linus Torvalds -

Hors ligne

#3 Le 19/11/2009, à 17:37

renofr

Re : Borne affichage images

Merci beaucoup redo_fr !!!

Maintenant, j'ai plusieurs fichiers dans mon répertoire FTP dont je ne connais pas les noms et dont le nombre peut varier (3 fichiers à 11h00, 4 fichiers à 11h03 puis 2 fichiers à 11h21). Je dois afficher un diaporama avec une pause de 10 sec entre chaque image.

Je me dis donc:

Toutes les 60 secondes:

- J'efface tous les fichiers (images) précédemments enregistrés
- Je récupère la liste des fichiers du répertoire FTP
- Je fais une boucle du genre
          for FICHIER in liste: 
             getfile(server, FICHIER, login, password)
- Légère modif de la fonction getfile pour enregistrer le fichier en RAMDISK (je n'ai pas de disque dur, juste une DOM toute pourrie à oublier pour écrire dessus!:) )

Pour la partie affichage, je fais encore une boucle du genre:

black= 0, 0, 0
FICHIERS=glob.glob('/media/ramdisk/*')
for im in FICHIERS:
           image = load_image(im)
                   screen.fill(black)
           screen.blit(image, (0, 0))
                   pygame.display.flip()
           time.sleep(10)

Encore un peu d'ordre à mettre dans tout ça mais je crois que ça commence à prendre forme :-)

Encore merci pour ton aide!

Hors ligne

#4 Le 19/11/2009, à 17:54

redo_fr

Re : Borne affichage images

Si tu n'as pas de disque mais beaucoup (hum...) de RAM, tu peux utiliser tmpfs smile
Cela va accélérer les traitements...

A placer dans /etc/fstab :

tmpfs      /tmp                 tmpfs                    defaults,size=1g                  0 0

Comme ça tu tembêtes plus à créer un RAMDISK, tu "colles" tout dans /tmp wink

L'avantage du tmpfs est qu'il est dynamique, il ne prend pas plus de RAM qu'il n'en a réellement besoin, même si tu le déclares plus grand (1Go dans mon exemple).

L'inconvénient éventuel, c'est que /tmp est "nettoyé" à chaque redémarrage (mais c'est plutôt un bon point du coté de la sécurité...)

Dernière modification par redo_fr (Le 19/11/2009, à 17:55)


Il n'y a pas de mauvais outils, il n'y a que de mauvais ouvriers
- papy -
Personnellement, je crois que faire des procès est un signe que les affaires vont mal. Je ne dis pas que Microsoft va mal, ce n'est qu'un signe, pas un indicateur...
- Linus Torvalds -

Hors ligne

#5 Le 23/11/2010, à 17:51

HP

Re : Borne affichage images

redo_fr a écrit :

L'inconvénient éventuel, c'est que /tmp est "nettoyé" à chaque redémarrage (mais c'est plutôt un bon point du coté de la sécurité...)

C'est de toute façon son comportement : http://en.wikipedia.org/wiki/Temporary_folder

Typically, /var/tmp is for persistent files (as it may be preserved over reboots), and /tmp is for more temporary files.


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne

#6 Le 23/11/2010, à 20:42

yannick19

Re : Borne affichage images

j'ai des photo et quand je les mes en fond d'écran sur le bureau elle sont trop grande comment faire pour qu'elle soit a la bonne taille sur mon ecran
j'ai un eepc asus j'ai ubuntu 10.10

Hors ligne

#7 Le 23/11/2010, à 20:49

shin01

Re : Borne affichage images

Simple clique droit sur ton bureau => changer l'arrière plan du bureau
Tu ouvres une fenêtre, où tu as plusieurs images de fond d'écran dont normalement la tienne

La tienne est préalablement sélectionnée, change le style en étiré, si cela ne te conviens pas, prends un autre style

Hors ligne