Je cherche à adapter pour Piwigo/Smarty un script de modification d'une image à la volée (ajout d'un watermark), mais je ne sais pas comment m'y prendre ...
Le code est le suivant :
<?php function my_function() { header('content-type: image/jpeg'); $watermark = imagecreatefrompng('local/css/img/watermark.png'); $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark); $image = imagecreatetruecolor($watermark_width, $watermark_height); $image = imagecreatefromjpeg($_GET['src']); $size = getimagesize($_GET['src']); $dest_x = $size[0] - $watermark_width - 5; $dest_y = $size[1] - $watermark_height - 5; imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); imagejpeg($image); imagedestroy($image); imagedestroy($watermark);} if (defined('IN_ADMIN')) // non applicable à l'interface d'administration return; add_event_handler('loc_end_picture', 'my_function'); ?>
mais la récupération de l'URL de l'image par $_GET['src'] ne fonctionne évidemment pas dans notre contexte. Puis-je avoir quelques pistes pour transposer ça ?
Merci d'avance.
Hors ligne
un truc du genre
global $template
$scr = $template->get_template_vars('SRC_IMG');
pour obtenir URL de l'image
Mais pour un plugin, je ferais également un pré filtre sur URL de l'image pour être sur que personne d'autre ne passe après toi
Hors ligne
ddtddt a écrit:
global $template
$scr = $template->get_template_vars('SRC_IMG');
pour obtenir URL de l'image
La première étape est franchie : on récupère bien l'image, et elle est traitée comme prévue.
Par contre, elle est affichée tout seule, telle quelle, dans la fenêtre du navigateur : toute la page html a disparu.
Comme si l'output se faisait directement vers le navigateur, et pas vers le template.
ddtddt a écrit:
Mais pour un plugin, je ferais également un pré filtre sur URL de l'image pour être sur que personne d'autre ne passe après toi
Pas compris ... peux-tu expliquer un peu ?
"personne d'autre" concerne un visiteur malintentionné, ou le développeur d'un autre plugin ou traitement ?
Hors ligne
tosca a écrit:
ddtddt a écrit:
global $template
$scr = $template->get_template_vars('SRC_IMG');
pour obtenir URL de l'imageLa première étape est franchie : on récupère bien l'image, et elle est traitée comme prévue.
Par contre, elle est affichée tout seule, telle quelle, dans la fenêtre du navigateur : toute la page html a disparu.
Comme si l'output se faisait directement vers le navigateur, et pas vers le template.
Avec cela tu récupère URL de l'image à toi de retraiter l'image et de réaffecté un nouvelle URL au template
C'était juste une réponse rapide pour te donner la direction pour 'intercepter' les données du template
Hors ligne
tosca a écrit:
ddtddt a écrit:
Mais pour un plugin, je ferais également un pré filtre sur URL de l'image pour être sur que personne d'autre ne passe après toi
Pas compris ... peux-tu expliquer un peu ?
"personne d'autre" concerne un visiteur malintentionné, ou le développeur d'un autre plugin ou traitement ?
C'est pour éviter les effets de bord des autres plugins et themes
Si tu intercepte en préfiltre le code de URL de l'image affiché dans le navigateur pour imposer ton nouveau code tu as peux chance qu'un autre action sur le code de URL viennent perturber le fonctionnement que tu mets en place (genre peux être un cache des nouvelles photo taille web pour ne pas obliger le serveur à les régénérer à chaque visite)
Est ce que je suis un peux plus claire ?
Hors ligne
ddtddt a écrit:
tosca a écrit:
... toute la page html a disparu.
Comme si l'output se faisait directement vers le navigateur, et pas vers le template.Avec cela tu récupère URL de l'image à toi de retraiter l'image et de réaffecté un nouvelle URL au template
Je ne suis pas sûre d'avoir compris ... l'image doit être modifiée à la volée avant affichage dans la page html, donc il ne devrait pas y avoir de changement d'URL :
1) on récupère l'image source -> ça marche, grâce à ce que tu m'as donné
2) on modifie l'image -> ça marche avec le script que j'ai déniché sur le web
3) on met l'image modifiée dans le template -> c'est ce qui reste à faire
ddtddt a écrit:
C'est pour éviter les effets de bord des autres plugins et themes
Si tu intercepte en préfiltre le code de URL de l'image affiché dans le navigateur pour imposer ton nouveau code tu as peux chance qu'un autre action sur le code de URL viennent perturber le fonctionnement que tu mets en place (genre peux être un cache des nouvelles photo taille web pour ne pas obliger le serveur à les régénérer à chaque visite)
Est ce que je suis un peux plus claire ?
Oui, je saisis mieux, mais :
- je voudrais d'abord obtenir un résultat conforme à ce que j'attends, avant de me pencher sur ce genre d'amélioration (sauf à ce que la mise en place du préfiltre soit absolument nécessaire)
- le thème est perso, et je limite les plugins externes au strict nécessaire => en principe, je devrais pouvoir gérer les interférences
Pour faire bref, si c'est plus compliqué pour un besoin que je n'ai pas (ou pas encore identifié, en tout cas), je préfère m'en passer, au moins dans un premier temps. ;-)
Hors ligne
tosca a écrit:
ddtddt a écrit:
tosca a écrit:
... toute la page html a disparu.
Comme si l'output se faisait directement vers le navigateur, et pas vers le template.Avec cela tu récupère URL de l'image à toi de retraiter l'image et de réaffecté un nouvelle URL au template
Je ne suis pas sûre d'avoir compris ... l'image doit être modifiée à la volée avant affichage dans la page html, donc il ne devrait pas y avoir de changement d'URL :
1) on récupère l'image source -> ça marche, grâce à ce que tu m'as donné
2) on modifie l'image -> ça marche avec le script que j'ai déniché sur le web
3) on met l'image modifiée dans le template -> c'est ce qui reste à faire
Tu affectes le nouveau chemin à SRC_IMG
avec un truc du genre
$newphoto='url de ton image modifié';
global $template;
$template->assign('SRC_IMG', $newphoto);
Hors ligne
ddtddt a écrit:
tosca a écrit:
...
3) on met l'image modifiée dans le template -> c'est ce qui reste à faireTu affectes le nouveau chemin à SRC_IMG
avec un truc du genre
$newphoto='url de ton image modifié';
global $template;
$template->assign('SRC_IMG', $newphoto);
Pas mieux : c'est toujours l'image modifiée qui s'affiche seule dans le navigateur.
Je me demande si ce n'est pas
header('content-type: image/jpeg');
qui provoque l'affichage immédiat de l'image modifiée, en court-circuitant tout le reste ; mais si je le retire, ma page est remplacée par des caractères cabalistiques (affichage du JPEG comme si c'était du texte ?) qui n'ont plus rien à voir ni avec la photo, ni avec Piwigo.
Hors ligne
si tu arrête la fonction break cela ne retourne pas à Piwigo ?
Hors ligne
ddtddt a écrit:
si tu arrête la fonction break cela ne retourne pas à Piwigo ?
"arrêter la fonction break" ? Je ne comprends pas ce que tu veux dire.
Hors ligne
avant l'accolade de la fin de ta fonction tu met break pour arrêter ta fonction et retourner à Piwigo
Mais je ne pense que header('content-type: image/jpeg'); ne sert à rien pour ton besoins
je dirais bien qu'il faut rajouter un lignes pour copier l'image générer quelque part
Hors ligne
et lui donner un nom pour pouvoir l'utiliser dans Piwigo
Hors ligne
Ca progresse, mais il y a encore quelque chose qui cloche ... D'après ce que j'ai trouvé sur cette page, il faut effectivement passer par une sauvegarde sur disque.
Mon code est maintenant le suivant :
function my_watermark() { global $template; $watermark = imagecreatefrompng('local/css/img/watermark.png'); $watermark_width = imagesx($watermark); $watermark_height = imagesy($watermark); $image = imagecreatetruecolor($watermark_width, $watermark_height); $scr = $template->get_template_vars('SRC_IMG'); $image = imagecreatefromjpeg($scr); $size = getimagesize($scr); $dest_x = $size[0] - $watermark_width - 5; $dest_y = $size[1] - $watermark_height - 5; imagecopymerge($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height, 100); imagejpeg($image, 'local/css/img/image.jpg', 100); $template->assign('SRC_IMG', 'local/css/img/image.jpg'); imagedestroy($image); imagedestroy($watermark);} if (defined('IN_ADMIN')) // non applicable à l'interface d'administration return; add_event_handler('loc_end_picture', 'my_watermark');
Je vérifie sans problème par FTP que l'image modifiée est bien sauvegardée dans local/css/img/image.jpg.
Lorsque je fais un var_dump de $template, je vois que c'est bien cette URL qui est reçue par le template ... mais l'image qui s'affiche est toujours celle d'origine, sans le watermark !
Qu'est-ce que j'ai pu oublier ?
Hors ligne
tu as éliminé l'effet cache du navigateur ?
en cliquant "afficher l'image", l'url est celle de ton image ou l'autre ?
Hors ligne
flop25 a écrit:
tu as éliminé l'effet cache du navigateur ?
en cliquant "afficher l'image", l'url est celle de ton image ou l'autre ?
L'URL est celle de l'image d'origine, pas celle correspondant à l'image modifiée. Ce qui voudrait dire qu'un peu plus loin dans le script, ce que j'ai indiqué comme URL est écrasé par l'URL initiale ?
Hors ligne