Problème librairie GD !

Signaler
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010
-
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010
-
Salut!

Problème.

J'ai créé une image avec la librairie GD, j'obtiens l'image en .php.

Je teste avec Chrome, Firefox, IE, et Safari (ainsi que sur le mobile):
Ca marche chez moi.

Un pote qui a linux me dit que le travail du GD ne fonctionne pas et qu'il voit l'image originelle...

Comment je peux contrer ça, s'il vous plait?

Merci

Buzii

22 réponses

Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Salut,

header('Content-Disposition: inline; filename=LeNomQueJeVeux.png');
header('Content-type: image/png');


à adapter en fonction du type d'image, tout ça tout ça...

Lecture recommandée :
- la doc de PHP
- La liste des entêtes HTTP
- Les spéc du W3C sur les entêtes HTTP 1.1

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Donc si j'ai bien compris, avec le code suivant je devrais générer correctement l'image?
header('Content-Disposition: inline; filename=000.jpg');
header("Content-type: image/jpeg"); 
session_start();
$size = getimagesize("http://www.monsite.com/000.jpg");

$image = imagecreatefromjpeg("http://www.monsite.com/000.jpg");



Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Tu veux faire quoi exactement ?

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Merci de t'intéresser à mon problème.

J'ai créé une image qui se dévoile petit à petit.

J'ai ce code sur un site, qui semble marcher:
ici : http://www.la-poule.com/jeu-poule.php

<?php

header("Content-type: image/png"); 
session_start();
$size = getimagesize("http://www.wachtelfarm-tf.de/bilder%20neu/Bresse2.jpg");

$image = imagecreatefromjpeg("http://www.wachtelfarm-tf.de/bilder%20neu/Bresse2.jpg");

$largeur=$size[0];
$hauteur=$size[1];
$ratio=$hauteur/$largeur;


$noir = imagecolorallocate($image,0,0,0);
$rouge = imagecolorallocate($image,255,0,0);
$bleu = imagecolorallocate($image,0,255,0);
$vert = imagecolorallocate($image,0,255,255);
$blanc = imagecolorallocate($image,255,255,255);
$jaune = imagecolorallocate($image,255,255,204);

imagesetthickness($image,$largeurpix);
//imagefilledrectangle ($image, 0, 0, $hauteur, $largeur, $noir);
imagerectangle ($image, $largeur/4, $hauteur/4, $largeur*3/4, $hauteur*3/4, $jaune);
imagepng($image); //renvoie une image sous format png
imagedestroy($image); //détruit l'image, libérant ainsi de la mémoire


?>


Je dis qu'il semble marcher car j'ai demander à un mec qui utilise Linux qui me dis qu'il voit une poule masquée par un carré blanc. Ce que je cherche à faire.

Pour l'autre site, ou j'ai testé ça:
http://www.rocdacier.com/jeu-outil/jeu-outil.php

header('Content-Disposition: inline; filename=000.jpg');
header("Content-type: image/jpeg"); 

session_start();

$size = getimagesize("http://www.rocdacier.com/jeu-outil/000.jpg");


/* on créé l'image en vraies couleurs avec une largeur de 50 pixels et une hauteur de 100 pixels */
$image = imagecreatefromjpeg("http://www.rocdacier.com/jeu-outil/000.jpg");

$largeur=$size[0];
$hauteur=$size[1];
$ratio=$hauteur/$largeur;


$noir = imagecolorallocate($image,0,0,0);
$rouge = imagecolorallocate($image,255,0,0);
$bleu = imagecolorallocate($image,0,255,0);
$vert = imagecolorallocate($image,0,255,255);
$blanc = imagecolorallocate($image,255,255,255);
$jaune = imagecolorallocate($image,255,255,204);

imagesetthickness($image,$largeurpix);
//imagefilledrectangle ($image, 0, 0, $hauteur, $largeur, $noir);
imagerectangle ($image, $largeur/4, $hauteur/4, $largeur*3/4, $hauteur*3/4, $jaune);
imagejpeg($image); //renvoie une image sous format png
imagedestroy($image); //détruit l'image, libérant ainsi de la mémoire


Sur ce code qui marche aussi chez moi sur 4 navigateurs, au bahut ,sur mobile, ils affichent correctement une clé de mandrin totalement masquée.

Le mec qui à Linux voit clairement la clé de mandrin non masquée ==>Bug.

Je ne sais pas trop quoi faire, sinon une détection de Linux et ejecter les gens qui ont linux

Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
$largeurpix n'est pas définie ?

Pourquoi tu laisses cette ligne en commentaire ?
//imagefilledrectangle ($image, 0, 0, $hauteur, $largeur, $noir);


Si je la décommente, chez moi, ça fonctionne bien (euh je précise que je suis sur Linux, histoire de te rassurer).
Enfin ça fonctionne bien... Ca me fait bien un rectangle plein, rempli de la couleur spécifiée...
La ligne juste après ne fait que tracer un rectangle tout bête, dont le trait de contour est de l'épaisseur définie avec imagesetthickness()

Bref, je vois pas où est le problème...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Elle est en commentaire car au départ je pensait construire 4 rectangle qui rétrecieraient au fur a mesure que le temps s'ecoule.

Mais ahhhhh!

je crois que j'ai déja eu un problème similaire...Ne faut-il pas créé un style, pour la couleur et l'épaisseur?

Je crois que ça m'avait fait ça une fois, je ne pouvais pas faire deux paramètres de suite. J'avais lu qu'il fallait créé un style, mais j'ai pas tout capté.

Sinon, tu devrais tout de meme voir un rectangle d'épaisseur environ 300pixels. Sinon, je pense que ta piste peut m'aider. C'est le thickness qui foire...


Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
J'ai du mal à comprendre le lien entre tout ce que tu dis...

En laissant la ligne mentionnée commentée, je vois bien un rectangle dont les contours ont une épaisseur... que j'ai du définir moi-mêem, parce que, comme je te le disais, $largeurpix n'est pas définie (peut-être dans un autre fichier chez toi, mais pas avec le code que tu as donné).
Donc effectivement, si je mets 1 c'est un rectangle très fin, sinon, il est plus épais (heureusement !).
Sinon, en décommentant cette ligne, en mettant par exemple ça :
imagefilledrectangle ($image, $largeur/4, $hauteur/4, $largeur*3/4, $hauteur*3/4, $noir);

J'obtiens ça :


Sinon, je comprends pas ton histoire de rétrécir au fur et à mesure...
Et je comprends pas non plus ton histoire de style...

Pour moi, y'a pas de problème : GD met bien un masque des dimensions voulues sur l'image que tu lui passes et ce, quel que soit le navigateur et l'OS du client (ce qui est normal !!!)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Parcequ'en réalité, je veux que l'image se découvre petit a petit par le centre. Au départ l'image est totalement couverte par un rectangle plein, puis petit à petit ma variable largeurpix, effectivement définie dans un autre fichier, diminue en fonction du timestamp.

Faut que je regarde pourquoi ce thickness et pris en compte sur un site et par sur l'autre et que pour les gens qui utilisent Linux. (Windows+(Firefox ou IE7 ou Chrome ou Safari)) ou Iphone==Nickel pour les deux.

Linux+Firefox ==bon pour 1 pas pour l'autre. Est-ce que ça peut venir d'un navigateur trop ancien?

Buzii
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Désolé pour le -repost, mais voici un lien avec l'image de ce que je vois et ce que je voudrais qu'on voit...

http://www.rocdacier.com/jeu-outil/test-bug.jpg

Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
AAAAAAAAAAAAAaaaaaaaaaaaaaaahhhhhh !!!!!!!!!!!!!

Je viens (enfin) de comprendre ce que tu veux... (je veux dire pour l'affichage)
Sauf pour le "se découvre petit à petit" => comment voudrais-tu que ça fonctionne très concrètement ? Qu'est-ce que tu as précisément en tête ? Parce que je ne saisis toujours pas...

Sinon, le navigateur et l'OS du client n'ont ABSOLUMENT RIEN A VOIR avec ce qui est généré côté serveur par PHP et GD !!!!!
L'image est LA MEME pour TOUT LE MONDE ! Sans exception...

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Est-ce que ça se rapproche de ce que tu veux ?

imagefilledrectangle($image, 0, 0, $largeur, $hauteur/4, $noir);
imagefilledrectangle($image, 0, 0, $largeur/4, $hauteur, $noir);
imagefilledrectangle($image, $largeur, $hauteur, $largeur*3/4, $hauteur/4, $noir);
imagefilledrectangle($image, $largeur, $hauteur, $largeur/4, $hauteur*3/4, $noir);


Maintenant, tentons d'en faire une fonction :
function reveal(&$image, $step, $color, $nb_steps = 10) {
settype($step, 'int');
settype($nb_steps, 'int');
if (gettype($image) 'resource' && get_resource_type($image) 'gd') {
if ($step != $nb_steps && $step != 0) {
$H = imagesy($image);
$W = imagesx($image);

// Hauteur des bandes horizontales
$h = ($nb_steps - $step) * $H / (2 * $nb_steps);
// Largeur des bandes verticales
$w = ($nb_steps - $step) * $W / (2 * $nb_steps);

imagefilledrectangle($image, 0, 0, $W, $h, $color);
imagefilledrectangle($image, 0, $H-$h, $W, $H, $color);
imagefilledrectangle($image, 0, $h, $w, $W-$h, $color);
imagefilledrectangle($image, $W-$w, $h, $W, $H-$h, $color);
}
elseif ($step == 0) {
imagefilledrectangle($image, 0, 0, imagesx($image), imagesy($image), $color);
}
}
}


Les arguments de la fonction sont :
- $image : l'image GD que l'on souhaite révéler
- $step : le numéro de l'étape de "révélation"
- $color: la couleur (ressource GD) de remplissage pour le "masque"
- $nb_steps : le nombre d'étapes de la "révélation".

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Pardon pour le double post, mais petite correction...
Remplacer
[ode=php]if ($step != $nb_steps && $step != 0) {/code
par :
if ($step < $nb_steps && $step != 0) {


--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Autre solution : créer une seconde image qui sera le masque et la coller sur la première. Le masque est alors un fond noir (par défaut) avec un rectangle transparent au milieu.

function reveal2(&$image, $step, $nb_steps = 10) {
settype($step, 'int');
settype($nb_steps, 'int');
if (gettype($image) 'resource' && get_resource_type($image) 'gd') {
if ($step < $nb_steps && $step != 0) {
$H = imagesy($image);
$W = imagesx($image);

// Hauteur des bandes horizontales
$h = ($nb_steps - $step) * $H / (2 * $nb_steps);
// Largeur des bandes verticales
$w = ($nb_steps - $step) * $W / (2 * $nb_steps);

$mask = imagecreatetruecolor($W, $H);
$blanc = imagecolorallocate($mask, 255, 255, 255);
$transparent = imagecolortransparent($mask, $blanc);
imagefilledrectangle($mask, $w, $h, $W-$w, $H-$h, $transparent);
imagecopymerge($image, $mask, 0, 0, 0, 0, $W, $H, 100);
}
}
}


J'ai enlevé le paramètre $color, puisqu'il s'agissait d'une couleur de $image, inutilisable sur une autre ressource. On peut passer en argument une couleur sous la forme d'un tableau contenant les valeurs RGB et utiliser cette couleur pour le masque.

Je ne sais pas si l'une des deux fonctions est plus performante que l'autre (peut-être la première du fait qu'elle n'utilise qu'une seule image GD ?), ce sont simplement deux manière d'aborder le problème, la seconde étant plus cohérente dans la logique : on crée un masque que l'on applique sur l'image, au lieu de colorier l'image elle-même.

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Tout d'abord merci de t'ètre penché(e) sur le problème de manière aussi impliquée.

Je viens de tester ton premier code sans la passer par une fonction, ça semble marcher, mais ça me paraissait un peu plus compliqué de calculer les coordonnées variables des points

La première partie du code correspond à peu près à celà:
<?php
header('Location: jeu-outil.php');   
session_start();

include 'labase.php';
@mysql_connect($dbhost,$dbuser,$dbpasswd) or die("Connexion impossible");
@mysql_select_db($dbname) or die("Echec de selection de la base");

$time=time();
$timequery88=  mysql_query("SELECT fin FROM compteur_jeu WHERE id='1'");
$timerow88 = mysql_fetch_array($timequery88);
$fin=$timerow88['fin'];
$tempsrestant=$fin-time();


if ($tempsrestant<=0) {echo "La partie est terminée ! Une autre reprendra très vite !";die();}
$largeurpix=round(300/518400*$tempsrestant);
$_SESSION['largeurpix'] = $largeurpix;$_SESSION['tempsrestant'] = $tempsrestant;
?>


En gros, je prends la valeur fin dans la base, qui correspond a environ 6 jours avant que l'image soit totalement découverte (518400 s). Le 300 est le rapport en pixels à dévoiler en 6 jours.

La variable tempsrestant est celle que je passe dans l'autre partie du code.

Ce qui me parait étrange dans ce que j'avais fait avant est que ça ne marche que sous Windows. J'ai fait faire des test à des gens qui ont Linux, tous ne voyaient pas le Rectangle dessiné et rempli, alors que sur tous les autres pc que j'ai testé (Windows) le remplissage était correct.

Je ne comprends pas non plus.

Si avec ta façon de faire (4 rectangles) le filtre fonctionne, dans ce cas là je trancherais pour cette solution sans avoir compris pourquoi il y a eu une erreur.

Je te ferais tester une fois terminé, si ça ne t'embète pas.
Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Ok, je pense que j'ai compris le fonctionnement de ton jeu.
En gros, l'image est généré à chaque affichage de la page et plus le temps passe, moins elle est masquée. En fait, j'ai fini de comprendre en voyant la manière dont tu calcules la quantité à afficher. Je ne pensais pas que c'était aussi fin.

Il n'en reste pas moins que la fonction reveal(), en elle-même, doit s'adapter très facilement.
Il te suffit de passer comme arguments :
$nb_steps : le temps en secondes pendant lequel l'image se dévoile (ici : 518400 secondes)
$step : le nombre de secondes écoulées depuis le début du jeu (ou bien la différence entre la date de fin et la date courante, en timestamps unix toutes les deux)

Par contre, je ne comprends pas bien le 300 "rapport en pixels à dévoiler en 6 jours"... Je crois comprendre que c'est la dimension maximale qui est dévoilée à la fin du jeu ?
La fonction ne prend certes pas cette variable en compte, je suis parti sur une image entièrement masquée qu'on dévoile entièrement. Mais il est assez facile de rajouter à la fonction deux arguments : le nombre de pixels visibles au début et à la fin et ne compter les étapes qu'entre ces valeurs plutôt qu'entre la hauteur de la largeur.
Je suis également parti du principe qu'on dévoille un rectangle de même proportions que l'image, pas un carré... Mais là aussi, ça peut s'arranger.

Pas de problème pour tester quand tu auras terminé ;)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Ah une dernière chose !

Je viens de penser à un avantage de la deuxième fonction, qui utilise un "calque" : on peut lui donner la forme qu'on veut, y compris un disque... On peut ainsi dévoiler l'image en agrandissant un disque transparent et en choisissant éventuellement les coordonnées de départ... Chose que l'on ne peut pas faire en travaillant directement sur l'image d'origine, puisqu'on a besoin de la transparence.

J'ai jamais vraiment travaillé avec GD (au mieux, j'avais fait des vignettes), du coup je me plonge un peu dedans... Je suis en train de faire une bibliothèque d'outils pour mapper GD (oui, ça existe déjà...) et peut-être que je ferai un outil pour ce genre de jeu, avec différentes manières de dévoiler une image (rectangle/carré, ellipse/cercle, losange, etc) et davantage de paramètres (le centre du masque transparent qui dévoile l'image, la couleur du masque, etc).

Merci donc d'avoir posé cette question :)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

Je m'était déja amusé avec le GD pour faire un truc un peu scientifique pour des industriels.
Ici:
Tapez le texte de l'url ici.


Et un captcha aussi
Voir ici:
Tapez le texte de l'url ici.

Je trouve ça super intéressant, ça fait bouger les neurones...Je n'ai pas encore testé la 2ème fonction je suis resté sur ta proposition de rectangles remplis que je viens d'adapter.

Le 300 correspond aux 300pixels (moitié de 600 de hauteur) pour dévoiler totalement.

La largeur est soumise aux 300*rapport (largeur/hauteur)

Si tu peux tester mon nouveau code ?

Ici:
Tapez le texte de l'url ici.

Tu devrais voir un bout de la nouvelle image...

Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Je vois l'image complète... Y'a un truc qui colle pas quelque part.
Est-ce que tu peux monter le code complet de la page ?

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)
Messages postés
32
Date d'inscription
mercredi 2 avril 2003
Statut
Membre
Dernière intervention
9 novembre 2010

J'ai eu la confirmation apr mon testeur sous Ubutu que ça ne marche pas.

Chez moi ça marche.

fichier jeu-outil2.php:
<?php

header('Location: jeu-outil.php');   
session_start();

include 'configbase.php';
@mysql_connect($dbhost,$dbuser,$dbpasswd) or die("Connexion impossible");
@mysql_select_db($dbname) or die("Echec de selection de la base");

$time= time();
$timequery88=  mysql_query("SELECT fin FROM compteur_jeu WHERE id='1'");
$timerow88 = mysql_fetch_array($timequery88);
$fin=$timerow88['fin'];
$tempsrestant=$fin-time();
$miseajour=time()+518400;
if ($_GET["adm"]==1) {mysql_query("UPDATE compteur_jeu SET fin='$miseajour' WHERE id='1'");}

if ($tempsrestant<=0) {echo "La partie est terminée ! Une autre reprendra très vite !";die();}
$largeurpix=round(300/518400*$tempsrestant);
$_SESSION['largeurpix'] = $largeurpix;$_SESSION['tempsrestant'] = $tempsrestant;
?>


fichier jeu-outil.php :
<?php
header('Content-Disposition: inline; filename =001.jpg');
header("Content-type: image/jpeg"); //la ligne qui change tout !

session_start();

$size = getimagesize("http://www.rocdacier.com/jeu-outil/001.jpg");


/* on créé l'image en vraies couleurs avec une largeur de 50 pixels et une hauteur de 100 pixels */
$image = imagecreatefromjpeg("http://www.rocdacier.com/jeu-outil/001.jpg");

$largeur=$size[0];
$hauteur=$size[1];
$ratio=$largeur/$hauteur;


$noir = imagecolorallocate($image,0,0,0);
$rouge = imagecolorallocate($image,255,0,0);
$bleu = imagecolorallocate($image,0,255,0);
$vert = imagecolorallocate($image,0,255,255);
$blanc = imagecolorallocate($image,255,255,255);
$jaune = imagecolorallocate($image,255,255,204);

//imagesetthickness($image,$largeurpix);
//imagefilledrectangle ($image, 0, 0, $hauteur, $largeur, $noir);
//imagerectangle ($image, $largeur/4, $hauteur/4, $largeur*3/4, $hauteur*3/4, $jaune);
imagefilledrectangle($image, 0, 0, $largeur, $largeurpix, $noir);
imagefilledrectangle($image, 0, 0, $largeurpix*$ratio, $hauteur, $noir);
imagefilledrectangle($image, $largeur, 0, $largeur-($largeurpix*$ratio), $hauteur, $noir);
imagefilledrectangle($image, 0, $hauteur, $largeur, $hauteur-$largeurpix, $noir);
imagejpeg($image);

//imagejpeg($image); //renvoie une image sous format png
imagedestroy($image); //détruit l'image, libérant ainsi de la mémoire


?>


Je ne suis pas développeur, je fais ça comme complément, alors mon code n'est peut-ètre pas le plus simple.


Buzii
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
16
Ok, j'ai identifié le problème.
J'en déduis donc les conditions de test qui ne sont pas valides, parce qu'elles ne sont pas effectuées dans les mêmes conditions, a priori.

Alors je t'avais déjà indiqué le truc qui causait une erreur (et qui fait que ça ne marche pas toujours). sur jeu-outil2.php la variable $largeurpix n'est pas définie.
Probablement sur ton serveur en local, register_globals est activé, ce qui fait qu'il n'est pas nécessaire de la définir, puisqu'elle est dans $_SESSION.
Ou alors : tu as la variable de session qui correspond et pas ton autre testeur.
Dans tous les cas, il est quasiment certain que les erreurs sont cachées avec error_reporting(0), ce qui n'est vraiment pas conseillé sur un serveur de dév/test.

Donc :
- vérifier l'existance de $_SESSION['largeurpix'] et vérifier sa validité (d'ailleurs, est-il vraiment pertinent d'utiliser une variable de session pour ça ?)
- activer l'affichage des erreurs avec error_reporting(E_ALL & E_STRICT)

--
Neige

Souvent la réponse à votre question se trouve dans la doc. Commencez par là ;)