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

Langage PHP Discussion :

Saturation de la mémoire avec un script de redimensionnement


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Par défaut Saturation de la mémoire avec un script de redimensionnement
    Soit le code suivant :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    <?
     
    // Memoire tampon PHP
    set_time_limit(0);
     
    // Chemin de départ
    $dir_base = "../photos/";
     
    // Ouverture du dossier
    $opendir = opendir($dir_base);
     
    // Chemin de destination
    $dir_dst = "../photos/thumbs/";
     
    // Qualite de l'image finale
    $qual = "100";
     
    while ($f = readdir($opendir)) {
    	// Nom du fichier de destination
    	$img_dst_name = 'thb-'.$f;
     
    	// si le fichier original existe
    	if(is_file($dir_base.$f)) {
    	// ------------------------------------
    	$ExtfichierOK = '" jpg JPG jpeg JPEG png PNG gif GIF"'; // (l espace avant jpg est important)
    	// extension du fichier
    	$xplode = explode('.',$f);
    	$extension = $xplode[sizeof($xplode)-1]; // dernier element
    	$extension = strtolower($extension); // on met en minuscule
    	echo 'Extension du fichier : '.$extension.'<br>';
    	// ------------------------------------
    	// si l extension correspond, on continue
    	if (strpos($ExtfichierOK,$extension) != '') {
     
    	// si le fichier de destination n'existe pas
    	if (!file_exists($dir_dst.$img_dst_name)) {
    	echo 'Le fichier de destination ('.$dir_dst.$img_dst_name.') reste a creer...<br>';
     
    	// ------------------------------------
    	// creation de la ressource-image de l image source
    	switch ($extension) {
    	case "jpg":
    	case "JPG":
    	case "jpeg":
    	case "JPEG":
    	   $img_src = imagecreatefromjpeg($dir_base.$f);
    	   break;
    	case "png":
    	case "PNG":
    	   $img_src = imagecreatefrompng($dir_base.$f);
    	   break;
    	case "gif":
    	case "GIF":
    	   $img_src = imagecreatefromgif($dir_base.$f);
    	   break;
    	 // On peut également ouvrir les formats wbmp, xbm et xpm
    	 // (vérifier la configuration du serveur)
    	} // fin switch
    	// ------------------------------------
     
    	// dimensions de l image source
    	// Exemple avec imagesx() et imagesy()
    	$img_src_width = imagesx( $img_src );
    	$img_src_height = imagesy( $img_src );
    	echo 'Largeur originale : '.$img_src_width.' px<br>';
    	echo 'Hauteur originale : '.$img_src_height.' px<br>';
    	// ------------------------------------
     
    	// on veut une image de destination
    	// de 640 pixels de large sur 480 de haut MAXI
    	$img_src_width_max = 640;
    	$img_src_height_max = 480;
    	echo 'Largeur max. souhaitee : '.$img_src_width_max.' px<br>';
    	echo 'Hauteur max. souhaitee : '.$img_src_height_max.' px<br>';
     
    	// $img_dst_name = 'thb-'.strtolower($f);
    	echo 'Travail de l image : <a href="'.$dir_base.$f.'" target="_blank">'.$dir_base.$f.'</a><br>';
    	echo 'Nom du fichier a creer : '.$img_dst_name.'<br>';
    	// ------------------------------------
     
    	// calcul de la taille de l image de destination
    	$ratiox = $img_src_width / $img_src_width_max; // ratio en largeur
    	$ratioy = $img_src_height / $img_src_height_max; // ratio en hauteur
    	$ratio = max($ratiox,$ratioy); // le plus grand
    	echo 'Ratio largeur : '.$ratiox.'<br>';
    	echo 'Ratio hauteur : '.$ratioy.'<br>';
    	echo 'Ratio selectionne : '.$ratio.'<br>';
    	// dimensions de l image dest
    	$img_dst_width = $img_src_width/$ratio;
    	$img_dst_height = $img_src_height/$ratio;
    	echo 'Nouvelle largeur : '.$img_dst_width.' px<br>';
    	echo 'Nouvelle hauteur : '.$img_dst_height.' px<br>';
    	// ------------------------------------
     
    	// si l image source est plus grande : on redimensionne
    	if ($img_src_width>$img_dst_width || $img_src_height>$img_dst_height) {
     
    	echo 'Qualite de la nouvelle image : '.$qual.'%<br>'; 
     
    	// Creation d une ressource-image de l image de destination
    	// (noire par defaut)
    	$img_dst_resource = imagecreatetruecolor($img_dst_width, $img_dst_height);
    	// ------------------------------------
     
    	// REDIMENSIONNEMENT (copie, redimensionne, re-echantillonne)
    	ImageCopyResampled($img_dst_resource, $img_src, 0, 0, 0, 0, $img_dst_width, $img_dst_height, $img_src_width, $img_src_height);
    	// ------------------------------------
     
    	// ENREGISTREMENT (en fonction de l extension) avec qualite a xxx%
    	 switch ($extension) { 
    	 case 'jpg':
    	 case 'JPG':
    	 case 'jpeg':
    	 case 'JPEG':
    		imagejpeg ($img_dst_resource, $dir_dst.$img_dst_name, $qual);
    		echo 'Suppression des valeurs tampons...&nbsp;( - '.$f.' - et - '.$img_dst_name.' - )';
    		imagedestroy ($img_src);
    		imagedestroy ($img_dst_resource);
    		echo '&nbsp;<img src="../check.png" /><br>';
    		// Affichage de confirmation d'écriture
    		echo 'Nouvelle image : <a href="'.$dir_dst.$img_dst_name.'" target="_blank">'.$dir_dst.$img_dst_name.'</a>...&nbsp;<img src="../check.png" /><br /><br />';
    		break;
    	 case 'png':
    	 case 'PNG':
    		imagepng ($img_dst_resource, $dir_dst.$img_dst_name, $qual);
    		echo 'Suppression des valeurs tampons...&nbsp;( - '.$f.' - et - '.$img_dst_name.' - )';
    		imagedestroy ($img_src);
    		imagedestroy ($img_dst_resource);
    		echo '&nbsp;<img src="../check.png" />';
    		// Affichage de confirmation d'écriture
    		echo 'Nouvelle image : <a href="'.$dir_dst.$img_dst_name.'" target="_blank">'.$dir_dst.$img_dst_name.'</a>...&nbsp;<img src="../check.png" /><br /><br />';
    		break;
    	 case 'gif':
    	 case 'GIF':
    		imagegif ($img_dst_resource, $dir_dst.$img_dst_name, $qual);
    		echo 'Suppression des valeurs tampons...&nbsp;( - '.$f.' - et - '.$img_dst_name.' - )';
    		imagedestroy ($img_src);
    		imagedestroy ($img_dst_resource);
    		echo '&nbsp;<img src="../check.png" />';
    		// Affichage de confirmation d'écriture
    		echo 'Nouvelle image : <a href="'.$dir_dst.$img_dst_name.'" target="_blank">'.$dir_dst.$img_dst_name.'</a>...&nbsp;<img src="../check.png" /><br /><br />';
    		break;
    	 } // fin switch
       } // fin si l image source est plus grande
       } // fin si le fichier de destination n'existe pas
    else echo 'Le fichier de destination (<a href="'.$dir_dst.$img_dst_name.'" target ="_blank">'.$dir_dst.$img_dst_name.'</a>) existe deja... Fichier suivant...&nbsp;<img src="../check.png" /><br><br>';
      } // fin si l extension correspond
      else
      echo 'Extension non reconnue... Fichier suivant...<br><br>';
      // fin si l extension ne correspond pas
     } // fin si le fichier original existe
    } // fin while
     
    closedir($opendir); // Fermeture du dossier
     
    echo '<br>Vos thumbnails sont disponibles dans le dossier '.$dir_dst.'<br>Merci de m avoir utilise... ;-)<br><br>';
    ?>
    Si aucune thumbnail n'a été faite, il commence le traitement et marche à merveille... Mais si il y'a trop d'images a traiter, il finit par me mettre une erreur de type saturation...

    Comment puis-je intégrer dans ce code un moyen de faire mettons un reload toute les 10 images ? De cette façon, il ne saturerait plus...

    Merci de votre aide...

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,

    Tu pourrais libérer de la mémoire en faisant un petit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    image_destroy($img_dst_resource);
    après chaque enregistrement de l'image dans la boucle.

  3. #3
    Membre éclairé Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Bonsoir,

    Tu pourrais libérer de la mémoire en faisant un petit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    image_destroy($img_dst_resource);
    après chaque enregistrement de l'image dans la boucle.
    en gros, juste avant ceci ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    (...)
     
    closedir($opendir); // Fermeture du dossier
     
    echo '<br>Vos thumbnails sont disponibles dans le dossier '.$dir_dst.'<br>Merci de m avoir utilise... ;-)<br><br>';
    ?>
    (4 lignes avant la fin)

  4. #4
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    J'ai rien dit il y a bien les image_destroy dans la clause switch :o

    Et si tu incrémentes la limite de mémoire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ini_set("memory_limit", "32M");

  5. #5
    Membre éclairé Avatar de Casio
    Homme Profil pro
    Historien numérique
    Inscrit en
    Novembre 2005
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Historien numérique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 312
    Par défaut
    Je vais essayer, mais j'en doute...

    N'existe t'il aucun moyen de faire un refresh de page au bout de 10 exécutions ?

Discussions similaires

  1. Saturation mémoire avec DataTables
    Par jayce23 dans le forum jQuery
    Réponses: 8
    Dernier message: 27/03/2014, 13h02
  2. [GIMP] Probleme avec un script de redimensionnement
    Par HeyMile dans le forum Scheme
    Réponses: 0
    Dernier message: 03/05/2012, 18h40
  3. Réponses: 0
    Dernier message: 26/03/2010, 12h16
  4. lire le contenu d'une adresse mémoire avec VB Script
    Par pierre.zelb dans le forum VBScript
    Réponses: 2
    Dernier message: 13/12/2006, 13h32
  5. Comment bien gerer la mémoire avec les TStringList?
    Par david_chardonnet dans le forum Langage
    Réponses: 5
    Dernier message: 18/06/2003, 09h57

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