8768 sujets

Développement web côté serveur, CMS

Bonjour
Je cherche à mettre au point un petit programme très simple qui fabrique une miniature (thumbnail) à partir d'un fichier jpeg.
En mettant des affichages entre les lignes, je trouve que la fonction php imagecopyresized() renvoie un statut négatif (c'est à dire qu'elle ne fonctionne pas, sans doute une erreur dans les paramètres passés, mais laquelle ??? ).
Question: comment faire pour debugger un appel de fonction de ce genre?
Voici le code (avec commentaires et traces de passage)
<?php
$image = $_SERVER['DOCUMENT_ROOT'] . '/images/posters/test.jpg';
$thumbnail = $_SERVER['DOCUMENT_ROOT'] . '/images/posters/test-t.jpg';
echo "<pre>", __FILE__, ' ', __LINE__, "</pre>";
makeThumbnail($image, $thumbnail, 0, 32);

/* fabriquer une miniature à partir d'une image jpeg 
		img_file: fichier image
		thumbnail_file: fichier miniature
		thumb_width: largeur de la miniature en pixels
		thumb_height: hauteur de la miniature en pixels
*/
function makeThumbnail($img_file, $thumbnail_file, $thumb_width, $thumb_height) {
	if(! file_exists($img_file)) return false;
	list($width, $height) = getimagesize($img_file);
	echo "<pre>", __FILE__, ' ', __LINE__, "\n",$width, "\t", $height,"</pre>";
	/* si la largeur de la miniature est spécifiée, calculer la hauteur en proportion
	   sinon calculer la largeur en proportion de la hauteur */
	$thWidth = $thumb_width;
	$thHeight = $thumb_height;
	if($thWidth > 0) $thHeight = $height * $thWidth / $width;
	else $thWidth = $width * $thHeight / $height;
	echo "<pre>", __FILE__, ' ', __LINE__, "\n","thWidth=$thWidth\tthHeight=$thHeight","</pre>";
	/* créer un objet image à partir du fichier image */
	$source = imagecreatefromjpeg($img_file);
	echo "<pre>", __FILE__, ' ', __LINE__, "\n";print_r($source);echo "</pre>";
	/* créer une miniature vide */
    $thumb = imagecreatetruecolor($thWidth, $thHeight);
	echo "<pre>", __FILE__, ' ', __LINE__, "\n";print_r($thumb);echo "</pre>";
	/* copier et mettre à l'échelle */
	$X = (imagecopyresized($thumb, $source, 0, 0, 0, 0, $thWidth, $thHeight) ? "OK" : "Not OK");	
	echo "<pre>", __FILE__, ' ', __LINE__, "\n";print_r($X);echo "</pre>";
	/* mettre la miniature dans le fichier miniature */
	imagejpeg($thumb, $thumbnail_file);
	return true;
}
?>

L'adresse du programme de test : http://www.alma-musica.net/images/posters/test.php

Merci de votre aide
Salut,

C'est vraiment pour uploader à partir d'un serveur en ligne où c'est pour recouper des images à partir d'un fichier source se trouvant sur ton bureau ? Je te demande ça parce que là, tout de suite, je viens de configurer un script pour faire la même chose, mais via javascript (avec Gulp). Donc si ça collait...

Je n'ai jamais besoin de créer de telles fonctions avec php étant donné que j'utilise WordPress qui fait déjà tout ça de base...
Bonjour !

D'après ce que j'ai trouvé :
bool imagecopyresized ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )


il y a dix paramètres à passer...

Dans votre code :
$X = (imagecopyresized($thumb, $source, 0, 0, 0, 0, $thWidth, $thHeight) ? "OK" : "Not OK");


il y a huit paramètres...

C'est peut-être ça...
Smiley smile
Merci pour vos réponses
Il s'agit de générer des fichiers sur le serveur lors de la première utilisation d'une image: je mets des images en pleine taille sur le serveur, je lance le programme qui cherche à afficher les miniatures, le programme se rend compte que certaines miniatures n'existent pas et les crée à la volée.
C'est pratique, beaucoup plus simple que de créer ces miniatures en local et les exporter. Elles sont dans un sous répertoire, si je veux tout régénèrer je supprime le sous répertoire et ça fait le travail au premier appel.

Ça marchait depuis des années avec une "classe PHP" trouvée sur internet sans que j'aie eu besoin de regarder de près comment c'était fait, mais depuis un changement de version de PHP, ça ne fonctionne plus.
J'ai donc essayé de faire ce petit programme 'à la main", et je suis tombé sur ce problème.
C'est là que j'ai vu que ce n'était pas facile à mettre au point. Les "images" ne sont pas des "objets" mais des "ressources". Quand on fait un print_r($image) on obtient un simple numéro de ressource, ce n'est pas très pratique pour comprendre ce qui ne va pas.

Zelena a raison, il manque des paramètres dans l'appel de la fonction.
En pratique, j'ai trouvé imagescale() qui fait exactement ce que je veux de facon beaucoup plus simple et efficace que le petit programme que j'ai cité dans mon message.

Je n'ai cependant pas marqué cette question comme "résolue" car je ne sais toujours pas comment faire de la mise au point des fonctions GD et images, mais comme je n'ai pas besoin d'utiliser cette branche du PHP de facon intensive, ca n'a pas beaucoup d'importance.