Aller au contenu

images créées dynamiquement.


Anonymus

Sujets conseillés

Bonjour,

1/

Je créé des images de facon dynamique, avec ce bout de code :

$img_out = imagecreatetruecolor( $width, $height);
imagecopyresampled($img_out, $img_in, 0, 0, 0, 0, imagesx($img_out), imagesy($img_out), imagesx($img_in), imagesy($img_in));

if($CONF['IMAGES']['MISE_EN_CACHE_DES_IMAGES'])
imagejpeg($img_out,$this_beautiful_image);

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", FALSE);
header("Pragma: no-cache");

header("Accept-Ranges: bytes");

//header("Content-length: ".filesize(imagejpeg($img_out)));
//header("Content-Type: ".$size['mime']);

header("Content-Type: image/jpeg");


$t = imagejpeg($img_out);

echo $t;


imagedestroy($t);
die("");

Seulement, j'aimerais bien renvoyer la taille de l'image, dans les headers.

Outre le fait que le javascript ne trouve jamais les dimensions des images, il ne trouve jamais non plus la taille (content-length) des images créées ainsi. Alors que c'est une info que l'on trouve toujours lorsqu'elles sont créées avec les programmes tels que paint, photoshop, et consors.

2/ Je créé ainsi toutes les images, mais il s'avère qu'il y en a.. vraiment beaucoup (site adulte ). Or les images d'origine sont assez grosses, et la lecture de ces images pour crééer, par exemple, les vignettes, est un processus assez long. J'ai donc eu idée de faire un cache. Je mets donc ces images en cache, histoire de gagner du temps, mais je me retrouve avec un cache de 36 000 images.

L'affichage est considérablement accéléré, mais auriez vous une autre idée pour optimiser ce traitement ?

ps : Je déclare dans les header de ne pas mettre en cache, mais c'est juste pour les tests ;)

3/ Quid du répertoire de 36 000 images :

- Il faut le laisser tel quel ?

- Il faut en créer 3 (un rép. par taille d'images.. ) ?

- Vous avez une autre technique ?

Si j'efface tout, y a t il des précautions à prendre, pour éviter les éventuels problèmes par la suite ?

Merci d'avance ;)

Lien vers le commentaire
Partager sur d’autres sites

Par pure curiosité, y-a-til plusieurs thèmes qui ressortent de ces 36000 photos ? Parce que pour le classement, cela peut considérablement simplifier les choses.

Autre chose. lorsque tu "crées" ces images, signifies-tu que tu les retravailles à partir d'autres non-optimisées ? J'entends par là, lorsque la page sera créée, des vignettes apparaîtront, optimisées via php à partir des photos originales, donc fort lourdes en poids ?

xpatval

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

imagejpeg() envoie l'image GD (image) au format JPEG sur la sortie standard (typiquement, le navigateur web), ou si filename est fourni, l'envoie dans un fichier. image a été créé par imagecreatetruecolor().

Donc l'utilisation que tu en fais me semble erronée, je verrais plutôt ça :

imagejpeg($img_out);
imagedestroy($img_out);

Ensuite pour récupérer la taille de ton image générée à la volée, afin de l'utiliser comme Content-length dans les header voici une méthode éfficace qui fait appel aux buffers de PHP :

// Nouveau buffer
ob_start();
imagejpeg( $img_out, "", 90 );
$imgdata = ob_get_contents();
$imgdatalength = ob_get_length();
// Vide le buffer sans l'envoyer
ob_end_clean();
// Les en-tête, tu peux mettre les autres si tu veux aussi;)
header("Content-type: image/jpeg");
header("Content-Length: ".$imgdatalength );
echo $imgdata;

Concernant le cache des images, c'est à mon avis la solution la plus adéquate. Mais actuellement, où est stocké les images qui sont mises en cache ?

Le fait de garder toutes les images dans un répertoire semble correcte, dans la mesure ou les fonction PHP faisant accès aux fichier utilise un cache interne, mais pour l'accès FTP au répertoire je t'avoue que ça pose des problème parfois quant à la grosseur du "LIST" des fichiers qui prends du temps à être récupérer...

Lien vers le commentaire
Partager sur d’autres sites

Par pure curiosité, y-a-til plusieurs thèmes qui ressortent de ces 36000 photos ? Parce que pour le classement, cela peut considérablement simplifier les choses.

Autre chose. lorsque tu "crées" ces images, signifies-tu que tu les retravailles à partir d'autres non-optimisées ? J'entends par là, lorsque la page sera créée, des vignettes apparaîtront, optimisées via php à partir des photos originales, donc fort lourdes en poids ?

xpatval

<{POST_SNAPBACK}>

Il y a 3 rubriques (donc l'équivalent de 3 themes), mais le problème n'est pas trop à ce niveau.

Au début de la page pour générer les images, il est dit :

if($CONF['IMAGES']['MISE_EN_CACHE_DES_IMAGES']){
   if (is_file($this_beautiful_image)){
 // echo $this_beautiful_image;
       echo readfile($this_beautiful_image);
       die("");
 }
}if($CONF['IMAGES']['MISE_EN_CACHE_DES_IMAGES']){
if ($_GET['acces'] != "admin")
   if (is_file($this_beautiful_image)){
       echo readfile($this_beautiful_image);
       die("");
}

Autrement dit, lorsqu'il va dans le cache, tout le problème de savoir quelle image il va chercher est réglé.

Pour ce qui est de la création des images, je pars à chaque fois sur l'image d'origine ;) Si je pars sur la plus grande image générée, j'ai déjà pas mal de perte de qualité. Et au final, ca fait une image 'moche' ;)

C'est dommage, d'avoir de belles images au départ, et petites et moches à l'arrivée.

Donc, à chaque fois, c'est bien l'image d'origine qui est reprise.

Par contre, à l'inverse, comme tu le sous entend (si j'ai bien compris ?)

Effectivement pour une galerie de 15 photos, je me retrouve à lire pas mal de fichiers image, et ca représente un 'certain poids' en lecture.

Je pensais que php irait plus vite, mais autant ce n'est pas génant pour une image, autant ca le devient pour plusieurs.

D'où mon idée du cache pour les images :

Si l'image existe déjà en cache, on renvoie celle-ci, sinon on la créée ;)

A partir de là, je créé une moulinette qui met toutes les images en cache, et le tour est joué. S'il vient à mon client de rajouter des images, elles se retrouveront rapidement en cache, et optimisées par rapport à l'image d'origine ;)

Lien vers le commentaire
Partager sur d’autres sites

Donc l'utilisation que tu en fais me semble erronée, je verrais plutôt ça :

imagejpeg($img_out);
imagedestroy($img_out);

Oui, tout à fait !!

je m'exécute ;)

Concernant le cache des images, c'est à mon avis la solution la plus adéquate. Mais actuellement, où est stocké les images qui sont mises en cache ?

Elles sont toutes dans le même répertoire '/file', dans le rép. /home.

Mais toutes dans cet unique répertoire.

je vais séparer les différentes images, pour en faire 3 groupes de 12000. Ca fera déjà pas mal ;)

Pour l'histoire des buffers, c'est effectivement la solution adhéquate ;)

J'aurais dû y penser avant :/

Merci ;)

Lien vers le commentaire
Partager sur d’autres sites

Excuse mes lamentables remarques de petit scarabée, maitre anonyme, mais 36000 lourdes images, ça doit peser sur un serveur, ça...Tout ça pour dire , car bien entendu je n'ai du rien capter à ton problème, que j'aurais plutôt eu tendance à stocker des images déjà optimisées (Photoshop ou firework font ça très bien en "batch")...

Mais je m'égare !

xpatval

Lien vers le commentaire
Partager sur d’autres sites

Oui effectivement la création préalable des "miniatures" (comme le conseille xpatval) avant est une solution comme une autre. Mais les utilisateur ne sont jamais très fiable dans ces situations (dimensions, format, compression , ...), on se retouve souvent avec des galeries de formes diverses ;D

En fait on ne parle pas vraiement de cache dans la situation que tu cites, le cache a une nature volatile, c'est à dire qu'il n'est conservé qu'un temps. Ce que tu fais c'est stocker les images miniaturisées sur le disque, donc l'accès sera assez lent. Toutefois GD n'est pas assez performant pour surpasser les accès au disque donc c'est la bonne solution.

Je procède ainsi dans le cas de galeries personnellement. L'utilisateur peut uploader autant de fichiers qu'il souhaite à la fois. C'est souvent demandé, il suffit d'utiliser la fonctionnalité de PHP qui permet de nommer un <input type="file"> avec un nom de tableau (genre fichiers[], comme nom de champ de formulaire), ce qui permet de récupérer plusieurs fichier dans le même tableau et de les analyser les un après les autres et les miniatures sont créés à ce moment-là (à partir de l'image d'origine). Il est clair que si l'utilisateur vient à modifier/supprimer une image la miniature doit être tenue à jour. Evidemment cela limite la mise à jour à mon système (le client ne peut pas uploader une image par FTP et attendre que les miniature soient créées ou mises à jour).

L'autre solution aurait été de créer à chaque fois les miniatures mais comme les image (je suppose) ne changent pas toutes les 5 minutes cela n'a pas vraiment d'intérêt ! Les miniatures changent quand l'image est mises à jour.

Modifié par TheRec
Lien vers le commentaire
Partager sur d’autres sites

Je ne suis pas un maitre, loin de là :)

Mais on problème c'est que je ne connais pas ces images. Si j'avais la liste de toutes les images dès le début, je pourrais toutes les passer dans photoshop, et elles seraient créées dès le début, mais j'en ai un certain nombre maintenant, et d'autres qui vont arriver par la suite.

Ce que je voudrais, c'est me passer complètement de photoshop. On met une image dans un répertoire, elle est prise en compte en 'x' exemplaires, sans se soucier d'avoir à les passer dans une moulinette photoshop ou autre.

Le problème suivant est (mais je ne connais pas suffisamment photoshop) qu'elles sont dans des sous-répertoires, eux mêmes dans d'autres sous-répertoires, etc. Je ne sais pas si l'on peut donner à photoshop un répertoire, et lui demander de le crawler pour faire des vignettes, des 'images popup' et des 'images normales' de photos prises dans des sous-sous-répertoires.

( Et prendre les sous-répertoires les uns après les autres, ca représente pas mal de boulot, il y en a vraiment pas mal !

Enfin, si ca marche, ca me ferait une méthode que je pourrais (peut être) exporter dans un futur projet ;)

( La microscopique fourmi que je suis s'incline devant le scarabée qui le fait avancer par ses remarques intéressantes ;) )

Lien vers le commentaire
Partager sur d’autres sites

Pour moi, hormis l'histoire des originaux, GD n'est pas assez performant dans la redéfinition, et je pense que les internautes du domaine que tu touches (hum !), apprécient aussi les photos de qualité...

Lors de tes tests, l'affichage des photos était franchement longuet (Gérard ?)

(Que la microscopique fourmi daigne me savater si je l'offense, mais l'immonde larve putride que je suis ne peut que respecter votre intense profondeur de réflexion...)

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...