IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèques et frameworks PHP Discussion :

[GD] Analyse de photo et d'affiche


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut [GD] Analyse de photo et d'affiche
    Bonjour à tous

    Dans le cadre professionnel, je dois créer un script qui analysera une image(photo, affiche) afin d'évaluer un pourcentage de couleur. J'ai donc commencé à réaliser un script qui dans un premier cas récupère la largeur et la hauteur de l'image et récupère pour chaque pixel le hexa (je pense plutot m'orienter sur un rgb .
    Ci dessous mon début de script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <?php
    $filename='tmp/affiche.jpg';
    if (exif_imagetype($filename) == IMAGETYPE_JPEG) {
        $im = imagecreatefromjpeg($filename);
    }elseif(exif_imagetype($filename) == IMAGETYPE_PNG) {
    	$im = imagecreatefrompng($filename);
    }
    $imagew = imagesx($im);
    $imageh = imagesy($im);
    $tableauarray=array();
    for ($y = 0; $y < $imageh; $y++) {
      for ($x = 0; $x < $imagew; $x++) {
    		$color = imagecolorat($im, $x, $y);
    		if($color){
    			$color = dechex($color);
    			if(!array_key_exists("#" . $color, $tableauarray))
    			{
    				$tableauarray += array("#" . $color => 1);
    			}else{
    				$tableauarray["#" . $color] = $tableauarray["#" . $color]+1;
    			}
    		}
    	}
    }
    print_r($tableauarray);
    ?>
    Hors, vu que je ne vais pas pouvoir gérer et limiter la taille des fichiers à tester, le script peut parti en saturation de RAM. J'ai réalisé quelques recherches sur le multiprocess mais en php, j'ai vu que c'était chaud et un peu merdique. Je suis en train de me demander si le choix technique que j'ai fait est le mieux.
    J'ai pensé à d'autres techniques comme le redimensionnement de la photo à une certaine dimension (de façon proportionnelle) mais je ne sais pas si le pourcentage sera également modifié ou pas.

    Je suis un peu perdu, pourriez vous m'orienter dans mes recherches. Je suis également prêt à recevoir toutes vos critiques.
    Bonne soirée à tous et merci d'avance.

    lemiranais

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu pourrais definir ton pourcentage de couleur ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Je dois au final indiquer le pourcentage de couleur sur une photo, affiche... ainsi que le pourcentage de rouge, jaune, bleu, noir et je ne sais plus quelle couleur. J'ai plus la liste en tête.
    En gros, c'est savoir sur une image, combien de pourcentage d'encre rouge, bleu, noir, jaune il y a.
    Penses-tu que le php soit conçu pour faire cela?
    Je ne gère pas trop d'autre langage de programmation.


    lemirandais

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Tu as déjà rencontre le problème de RAM que tu crains ?
    Quelle taille font tes images ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Tu as déjà rencontre le problème de RAM que tu crains ?
    Quelle taille font tes images ?
    Pour le problème de ram, c'est dû à un mémory limit de 32M. Si j'augmente, je pense que je n'aurais plus ce soucis. Après tout dépend la taille du fichier à tester.

    La taille des images est variable, cela peut être un format A4 en 300dpi qu'un fichier A5 à 100dpi. D'où mon idée de créer une miniature (format par exemple A4 à 72dpi) pour calculer sur cette version le pourcentage. Après est ce la bonne méthode, je ne sais pas.

    lemirandais

  6. #6
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 846
    Points : 6 530
    Points
    6 530
    Par défaut
    Effectivement ce genre de tâche est plutôt à confier à un langage compilé. Je viens de faire un test avec une image de moins de 1Mo et c'est déjà pas fulgurant, je n'ose imaginer avec plus. Cela dit tu peux améliorer un peu le script, en sortant le dechex de la boucle (ça ne sert à rien de convertir x fois le même nombre, autant le faire à la fin):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    $filename='jeune-ragondin.jpg';
     
    // TODO: controler la taille du fichier
     
    $imgType = exif_imagetype($filename);
     
    switch ($imgType) {
        case IMAGETYPE_JPEG: $im = imagecreatefromjpeg($filename); break;
        case IMAGETYPE_PNG: $im = imagecreatefrompng($filename); break;
        default: throw new Exception('Format d\'image non supporté');
    }
     
    $clrs = []; // ou $clrs = array(); si PHP < 5.4
     
    $width = imagesx($im);
    $height = imagesy($im);
     
    for ($y = 0; $y < $height; $y++) {
        for ($x = 0; $x < $width; $x++) {
            $color = imagecolorat($im, $x, $y);
            if ($color) {
                if (isset($clrs[$color]))	
                    $clrs[$color]++;
                else 
                    $clrs[$color] = 1;
            }
        }
    }
     
    $keys = array_map(function ($i) { return sprintf("#%06x", $i); }, array_keys($clrs));
     
    $clrs = array_combine($keys, $clrs);
     
    //arsort($clrs);
     
    print_r($clrs);
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Effectivement ce genre de tâche est plutôt à confier à un langage compilé. Je viens de faire un test avec une image de moins de 1Mo et c'est déjà pas fulgurant, je n'ose imaginer avec plus. Cela dit tu peux améliorer un peu le script, en sortant le dechex de la boucle (ça ne sert à rien de convertir x fois le même nombre, autant le faire à la fin):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    $filename='jeune-ragondin.jpg';
     
    // TODO: controler la taille du fichier
     
    $imgType = exif_imagetype($filename);
     
    switch ($imgType) {
        case IMAGETYPE_JPEG: $im = imagecreatefromjpeg($filename); break;
        case IMAGETYPE_PNG: $im = imagecreatefrompng($filename); break;
        default: throw new Exception('Format d\'image non supporté');
    }
     
    $clrs = []; // ou $clrs = array(); si PHP < 5.4
     
    $width = imagesx($im);
    $height = imagesy($im);
     
    for ($y = 0; $y < $height; $y++) {
        for ($x = 0; $x < $width; $x++) {
            $color = imagecolorat($im, $x, $y);
            if ($color) {
                if (isset($clrs[$color]))	
                    $clrs[$color]++;
                else 
                    $clrs[$color] = 1;
            }
        }
    }
     
    $keys = array_map(function ($i) { return sprintf("#%06x", $i); }, array_keys($clrs));
     
    $clrs = array_combine($keys, $clrs);
     
    //arsort($clrs);
     
    print_r($clrs);
    Je teste avec un fichier de 1.5Mo et je peux te dire que c'est long, mais je teste pas mal avec php-cli. Et en plus, le traitement n'est pas encore fini.

  8. #8
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 846
    Points : 6 530
    Points
    6 530
    Par défaut
    Tu as du rater quelque chose, pour ma part une image A3 en 300dpi (photo) se traite en 20s et une image blanche en 5s et je pense pas qu'il faille espérer mieux avec du PHP. Tu peux également enlever le test if ($color) de la boucle.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  9. #9
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Ok, je vais refaire des tests, pourrais-tu me dire quel memory limit tu as sur ton bécane?

    lemirandais

  10. #10
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 846
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 846
    Points : 6 530
    Points
    6 530
    Par défaut
    Ma configuration php n'a pas de limite de mémoire configurée (memory_limit = -1), je pense qu'il doit s'en cacher une dans la configuration d'apache, quelque part...
    Mais de toute façon je ne pense pas que ce soit le nœud du problème (même si la consommation d'un tel script est relativement importante). À titre d'exemple le script utilise ~260Ko pour l'image blanche et ~42Mo pour une photo, c'est clairement lié au nombre de couleurs différentes de l'image (95000 pour la photo) et donc à la taille du tableau généré.

    D'ailleurs, le fait de changer le tableau de résultat en un tableau associatif avec pour clefs des chaînes hexadécimales multiplie par trois la quantité de mémoire nécessaire (alors que c'est purement esthétique). En laissant le tableau tel quel le traitement de la photo ne nécessite plus que 14Mo.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    Merci pour cette réponse mais chez moi, impossible de le faire fonctionner.
    Fichier de test: 1.5Mo => 3621px par 5120px soit 18539520pixels.
    Memory limit: 128M

    Je vais tenter une autre idée pour voir si cela fonctionne.

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je pense de toute façon qu'il faut revenir au départ du problème.
    Comment comptes-tu convertir tes coordonnées RGB en quantité d'encre ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre actif
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2007
    Messages
    282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Octobre 2007
    Messages : 282
    Points : 229
    Points
    229
    Par défaut
    En effet, pour le rendu final, le RGB ne sert à rien, mais plutôt le CMJN.
    Je suis en train de faire un essai en codant un système avec nodeJs afin d'avoir une rapidité de traitement plus rapide et multiprocess. Pour le format PNG j'ai trouvé le bon module, mais pour le JPEG, pas encore.

    lemirandais

  14. #14
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ma question n'était pas innocente : actuellement tu enregistres toutes les couleurs exactes dans le tableau, donc la mémoire nécessaire est très grande.
    Si pour chaque pixel tu détermines directement tes composantes d'encres, tu n'auras que 5 chiffres à stocker.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

Discussions similaires

  1. Prendre une photo puis l'afficher
    Par thibaut38410 dans le forum Android
    Réponses: 9
    Dernier message: 20/02/2014, 19h42
  2. Prendre une photo et l'afficher dans une ImageView
    Par bsidy1 dans le forum Composants graphiques
    Réponses: 8
    Dernier message: 14/06/2013, 15h44
  3. Comment réaliser une galerie photo avec photo qui s'affiche au survol à un autre endroit
    Par marion.bouilly dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 23/07/2011, 02h03
  4. [Turbo Pascal] Peut-on utiliser GetPixel pour analyser une image sans l'afficher ?
    Par _Hope_ dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 01/01/2009, 23h07
  5. photo ne s'affichant pas
    Par helenepiano dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 23/11/2007, 23h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo