Upload de fichiers vérification renommage redimensionnements

Petit nouveau ! | 8 Messages

07 janv. 2011, 17:23

Re saljut AB,
et merci pour ta patience. Après deux trois recherche je suis arrivé à la même conclusion que toi :) . Il faut que je booste mon forfait sur 1and1 ou bien prendre un serveur dédié. La valeur max pour "memory_limit" est 32M sur 1and1. La dimension max que je peux utiliser est de 1280x1024.

Merci pour tout.

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2011, 18:39

Re saljut AB,
et merci pour ta patience. Après deux trois recherche je suis arrivé à la même conclusion que toi :) . Il faut que je booste mon forfait sur 1and1 ou bien prendre un serveur dédié. La valeur max pour "memory_limit" est 32M sur 1and1. La dimension max que je peux utiliser est de 1280x1024.

Merci pour tout.
Oui et j'ai oublié de préciser que la mémoire nécessaire pour un redimensionnement dépend à la fois de la résolution de l'image source et de la résolution de l'image cible.

D'ailleurs je n'avais pas tenu compte de la résolution de l'image cible dans la fonction de vérification. Pour des images cibles de grande résolution, la fonction n'intervenait pas pour intercepter le problème et le serveur renvoyait une page blanche en cas de mémoire insuffisante ou, suivant la configuration du serveur, le message de dépassement du maximum du post autorisé (ce qui n'était pas adapté).

Je viens donc de mettre en ligne la version 2.0 qui corrige ce problème :)
Dernière édition par AB le 29 janv. 2011, 18:01, édité 1 fois.

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2011, 19:37

Version 2.0 en ligne :)

Optimisation de la fonction qui gère les problèmes de dépassement mémoire pour le traitement et le redimensionnement des images de types 'jpg', 'jpeg' (voir message ci-dessus).



Pour info, une mémoire disponible - ini_get('memory_limit') - de 32 Mo permet de redimensionner des fichiers jpg d'environ 5 à 6 Mega pixels en environ 1200 * 1000 pixels maximum. Pour plus de précisions testez le script ci-dessous sur votre serveur d'évaluation.
<?php
header('Content-Type: text/plain');

ini_set('memory_limit', '128M');


function format_size($size) {
  if ($size < 1024) {
    return $size . ' bytes';
  }
  else {
    $size = round($size / 1024, 2);
    $suffix = 'KB';
    if ($size >= 1024) {
      $size = round($size / 1024, 2);
      $suffix = 'MB';
    }
    return $size . ' ' . $suffix;
  }
}


$start_mem = memory_get_usage();



echo "\n\n";

echo 'Memoire disponible : ' . ini_get('memory_limit') . "\n";
echo 'Memory Usage initial : ' . format_size($start_mem) . "\n";

// Indiquez une image jpg valide (sur le serveur d'évaluation)
$image = 'repertoire/ma_photo.jpg';


echo "\n";


$info = getimagesize($image);
	 
$im = imagecreatefromjpeg($image);

$mem = memory_get_usage();

echo 'Memory usage: ' . format_size($mem) . "\n";
echo 'imagecreatefromjpeg necessaire: ' . format_size($mem - $start_mem) . "\n\n";


// Indiquez des dimensions pour l'image de destination
$largeur_destination = '1280';
$hauteur_destination = '1024';

$ressource = @imagecreatetruecolor ($largeur_destination, $hauteur_destination);
	 
$mem2 = memory_get_usage();
echo 'Memory usage: ' . format_size($mem2) . "\n";

echo 'imagecreatetruecolor necessaire: ' . format_size($mem2 - $mem) . "\n\n";


echo 'Total necessaire : ' . format_size($mem2 - $start_mem) . "\n";
?>

ViPHP
ViPHP | 5462 Messages

09 janv. 2011, 22:01

quand on manipule les images tout est convertie en brute donc recompresser, avec 4 canaux RGBA de 32bits chaqu'un, ce qui fait 128 bits donc 16 octets par pixel, ensuite il suffis de multiplier, par le nombre, une image de 1024 x 768 fera théoriquement 12mo, pour une image d'un appareil classique genre 10 megapixels, on arrive a 140mo pour une image de 3840 × 2400 :wink:

ViPHP
AB
ViPHP | 5818 Messages

09 janv. 2011, 22:46

quand on manipule les images tout est convertie en brute donc recompresser, avec 4 canaux RGBA de 32bits chaqu'un, ce qui fait 128 bits donc 16 octets par pixel, ensuite il suffis de multiplier, par le nombre, une image de 1024 x 768 fera théoriquement 12mo, pour une image d'un appareil classique genre 10 megapixels, on arrive a 140mo pour une image de 3840 × 2400 :wink:
Heu... t'a testé avec le bout de script que je viens de donner dans le message précédent et qui mesure la mémoire effective utilisée ? Dans la pratique on est très très loin de tes calculs théoriques...

ViPHP
ViPHP | 5462 Messages

09 janv. 2011, 22:59

quand on manipule les images tout est convertie en brute donc recompresser, avec 4 canaux RGBA de 32bits chaqu'un, ce qui fait 128 bits donc 16 octets par pixel, ensuite il suffis de multiplier, par le nombre, une image de 1024 x 768 fera théoriquement 12mo, pour une image d'un appareil classique genre 10 megapixels, on arrive a 140mo pour une image de 3840 × 2400 :wink:
Heu... t'a testé avec le bout de script que je viens de donner dans le message précédent et qui mesure la mémoire effective utilisée ? Dans la pratique on est très très loin de tes calculs théoriques...
Oui c'est pour ca que c'est de la théorie, brute et seule une image prendra cette taille en mémoire. j'ai jamais dit que que c'était la taille pris par GD lorsque qu'il ouvre une image. Faut plus considérer ca comme la taille minimal que peu prendre une image décompressé.

ViPHP
AB
ViPHP | 5818 Messages

10 janv. 2011, 00:51

Oui c'est pour ca que c'est de la théorie, brute et seule une image prendra cette taille en mémoire. j'ai jamais dit que que c'était la taille pris par GD lorsque qu'il ouvre une image. Faut plus considérer ca comme la taille minimal que peu prendre une image décompressé.
Mais je vois toujours pas l'intérêt de ton calcul pour le problème qui m'intéresse. Avec 64 Mo on peut normalement redimensionner avec GD des fichiers jpg de 10 Mega pixels pour peu que la résolution cible ne soit pas très importante, et tu me dis qu'on arrive à 140mo pour une image de 3840 × 2400 en décompressé. Mais à quoi ça peut bien me servir ?
Dernière édition par AB le 10 janv. 2011, 13:57, édité 2 fois.

ViPHP
ViPHP | 5462 Messages

10 janv. 2011, 01:07

c'est pas 10Mo pixels, mais 10megapixel, donc 10 millions de pixel, et 10 millions de pixel, correspond a une image type stand de 3840 × 2400 (9.22 megapixels), le taille en octet de l'image dépend de le compression, 10megapixels en jpeg on doit être en 5 et10mo, mais en non compresser est bien a 140mo, GD la décompresse et met tout en mémoire donc si t'ouvres une image de 10Mo de taille qui correspond a un jpeg d'une image de 10megapixel donc du 3840 × 2400, la consommation de mémoire va être au minium de 140Mo

Âpres si on joue sur la compression, tu peux avoir une image de 400Ko et de 2Mo, si la résolution de l'image est la même (1024 x 728 par ex) elles vont prendre la même place niveau mémoire donc 12Mo, tout ca pour dire que la consommation de mémoire ne dépend pas du poids du fichier mais la la résolution de l'image.

EDIT : GD travail en couleur 8bits, donc une image de 1024 x 768, va lui prendre en minimum 3Mo et une image de 3840 × 2400 : 35Mo
c'est peu être plus cette info la qui t'intéresserait :wink:

ViPHP
AB
ViPHP | 5818 Messages

10 janv. 2011, 01:41

c'est pas 10Mo pixels, mais 10megapixel,
Oui bon merci, je te fais pas remarquer toutes tes fautes de frappes sinon j'en finirais pas :P
GD la décompresse et met tout en mémoire donc si t'ouvres une image de 10Mo de taille qui correspond a un jpeg d'une image de 10megapixel donc du 3840 × 2400, la consommation de mémoire va être au minium de 140Mo
C'est pas ce que mesurent les tests, c'est plutôt entre 45 - 50 Mo
tout ca pour dire que la consommation de mémoire ne dépend pas du poids du fichier mais la la résolution de l'image.
Merci de me le rappeler mais je croyais avoir été assez clair :
2/ Concernant le redimensionnement

La capacité de redimensionnement est indépendante du poids du fichier et dépend uniquement de la résolution de l'image. C'est à dire qu'un fichier de 500ko pourra ne pas être redimensionné s'il a une très grande résolution. Cette limitation vient du paramètre serveur "memory_limit" car le redimensionnement utilise d'autant plus de mémoire que la résolution du fichier est importante...

ViPHP
ViPHP | 5462 Messages

10 janv. 2011, 01:51

GD la décompresse et met tout en mémoire donc si t'ouvres une image de 10Mo de taille qui correspond a un jpeg d'une image de 10megapixel donc du 3840 × 2400, la consommation de mémoire va être au minium de 140Mo
C'est pas ce que mesurent les tests, c'est plutôt entre 45 - 50 Mo
140mo c'etait dans l'hypothèse où GD travaillerai en 32bit mais c'est pas le cas, comme il est en 8bit, c'est 35mo + l'image dans un format interne (puisqu'il faut bien récupérer les pixels en 32bit a un moment)

ViPHP
AB
ViPHP | 5818 Messages

10 janv. 2011, 02:22

Si le sujet t'intéresse y'a de la doc :

http://www.php.net/manual/fr/function.i ... .php#56032
http://www.php.net/manual/fr/function.i ... .php#61708
http://www.php.net/manual/fr/function.i ... .php#76968
http://www.php.net/manual/fr/function.i ... .php#99623
Sur ce dernier lien, après tests, la méthode pour le gif n'est pas bonne, car dépend trop du nombre de couleurs du gif d'origine.
Pour cette raison la fonction de vérification de la mémoire nécessaire pour le redimensionnement des images n'est active que pour les fichiers JPG/JPEG

Petit nouveau ! | 4 Messages

14 mars 2011, 17:39

Bonjour et bravo pour le code,

Je suis plutôt newbie dans le code php et j'aurais voulu savoir s'il était possible de récupérer une valeur $mavaleur via $POST pour l'injecter dans la fonction Set_Nomme_Fichier.
J'ai essayé ça mais sans succés et au vu de mes compétences en php et ben j'suis bloqué.

dans le php:

$form2_photo->Set_Renomme_fichier ('incr');
$form2_photo->Set_Nomme_fichier ("".$_POST['mavaleur']."",'ext_fichier_telecharge');

Et dans le formulaire:
<label for="mavaleur">Numéro du mandat</label><br />
<input type = "text" name = "mavaleur" size = "70"/><br /><br />

Du coup j'ai une erreur:
- Le nom de fichier "" envoyé en paramétre à la fonction "Set_Nomme_fichier" n'est pas un nom de fichier valide.

Si c'est faisable je me doute que oui comment dois je m'y prendre.

En vous remerciant

ViPHP
AB
ViPHP | 5818 Messages

14 mars 2011, 18:27

Oui c'est parce que quand la classe fait le test des paramètres, à l'initialisation de la classe il n'y a pas encore de valeur pour $_POST['mavaleur'];

Donc tu peux déclarer une valeur par défaut pour le nom de fichier qui existera même si aucun post n'est envoyé :
$form2_photo->Set_Renomme_fichier ('incr');

$nom_fichier = isset($_POST['mavaleur']) ? $_POST['mavaleur'] : 'nom_par_defaut';
$form2_photo->Set_Nomme_fichier ($nom_fichier,'ext_fichier_telecharge');
donc 'nom_par_defaut' ne sera jamais utilisé mais cela donne juste à la classe un argument valide à tester en attendant la valeur du $_POST;

Pour info, c'est le même principe que cet exemple qui permet de choisir un dossier de destination en fonction de la valeur d'un post : on déclare un dossier valide en attendant la valeur du post.
Il faut éviter de mettre l'initialisation de la classe à l'intérieur de la condition if (isset($_POS['index'])) {//initialisation de la classe... } car la classe ne pourrait pas envoyer de message d'erreur en cas du dépassement du post_max_size puisque dans ce cas aucun post ne serait renvoyé et donc la classe ne serait pas instanciée.
Dernière édition par AB le 15 mars 2011, 03:13, édité 1 fois.

Petit nouveau ! | 4 Messages

14 mars 2011, 23:35

Merci beaucoup pour l'aide, la réactivité et la qualité des explications fournies.
c'est nickel.

Encore merci beaucoup

Il me reste un bon bout de chemin a gravir encore :), mais j'y travaille !!!

Suite a une demande faite en mp a AB je vous partage ici ma demande et sa réponse ça pourra en aider d'autre.
Encore merci a AB pour ça réactivité et le partage de ses compétences.

Ma demande :
"... je voudrai juste pouvoir récupérer les nouvelles valeurs de renommage, qui s'affiche dans le bas de page après l'envoi des images, dans un nouveau formulaire.
En gros une fois validé le téléchargement des images je récupère leurs nouveaux noms pour les intégrées dans mon formulaire d'injection de données.
Vous devez vous dire c'est simple, normalement oui mais la je ne sais pas comment récupérer les valeurs obtenues par la classe et les passer en post dans un nouveau formulaire d'insertion de données. "

La réponse de AB :

Dans mon exemple on lit le tableau des résultat comme ceci :
                <?php
                // Lecture du tableau des résultats (se trouve ici uniquement pour la démonstration et visualiser la structue des tableaux de résultat)
                if (!empty ($tranfert_form1))
                        {
                                $identifant = $tranfert_form1['identifiant'];
                                $champ = $tranfert_form1['champ'];     
                                $resultat = $tranfert_form1['resultat'];//tableau à trois dimensions
                           
                                
                                echo $identifant.' :<br /><br />';
                           
                                foreach ($resultat as $num => $rep)
                                        { 
                                                foreach ($rep as $key => $value)
                                                        {                                                       
                                                                if(!empty($value['nom']))                                  
                                                                echo 'champ '.$champ.' n° '.$num.' = '.$value['nom'].' '. $value['dim'].', téléchargé dans "'.$key.'"<br />';
                                                        }     
                                        }   
                        } ?>
Pour mettre les noms de fichiers téléchargés dans un formulaire il suffit d'écrire à l'intérieur du formulaire :
<?php   
                if (!empty ($tranfert_form1))
                        {
                                //$identifant = $tranfert_form1['identifiant'];
                                //$champ = $tranfert_form1['champ'];     
                                $resultat = $tranfert_form1['resultat'];//tableau à trois dimensions
                           
                                
                                //echo $identifant.' :<br /><br />';
                           
                                foreach ($resultat as $num => $rep)
                                        { 
                                                foreach ($rep as $key => $value)
                                                        {                                                       
                                                                if(!empty($value['nom']))                                  
                                                                echo '<input type = "text" name = "fichier_telecharge[]" value = " '.$value['nom'].'" />';
                                                        }     
                                        }   
                        } ?>
Encore merci
Dernière édition par Mad-System le 31 mai 2011, 00:45, édité 1 fois.

Petit nouveau ! | 8 Messages

13 avr. 2011, 16:55

Re salut, juste pour dire merci à votre mini débat AB et stealth35 vous m'avez bien aidé merci :wink:
c'est pas 10Mo pixels, mais 10megapixel,
Oui bon merci, je te fais pas remarquer toutes tes fautes de frappes sinon j'en finirais pas :P
GD la décompresse et met tout en mémoire donc si t'ouvres une image de 10Mo de taille qui correspond a un jpeg d'une image de 10megapixel donc du 3840 × 2400, la consommation de mémoire va être au minium de 140Mo
C'est pas ce que mesurent les tests, c'est plutôt entre 45 - 50 Mo
tout ca pour dire que la consommation de mémoire ne dépend pas du poids du fichier mais la la résolution de l'image.
Merci de me le rappeler mais je croyais avoir été assez clair :
2/ Concernant le redimensionnement

La capacité de redimensionnement est indépendante du poids du fichier et dépend uniquement de la résolution de l'image. C'est à dire qu'un fichier de 500ko pourra ne pas être redimensionné s'il a une très grande résolution. Cette limitation vient du paramètre serveur "memory_limit" car le redimensionnement utilise d'autant plus de mémoire que la résolution du fichier est importante...