Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > Images > GD
GD Forum d'entraide pour l'extension GD permettant de manipuler des images en PHP. Avant de poster -> tutoriels GD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/01/2008, 18h14   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 26
Points : 11
Points : 11
Envoyer un message via MSN à phcorp Envoyer un message via Yahoo à phcorp Envoyer un message via Skype™ à phcorp
Par défaut Rapidité de génération d'images

Bonjour,

j'ai crée une page php qui permet de changer une couleur d'une image en une autre couleur preview.

Cependant, je suis confronté à un problème de lenteur: une image met au moins une dizaine de secondes à se générer ( et parfois même, c'est tellement lent que le navigateur ne l'affiche pas ).
C'est pourquoi j'aimerais gagner en rapidité.

Voci quelques informations à propos de comment l'image est générée :
1/ je récupère l'image de départ avec imagecreatefrompng(); puis ses dimensions avec imagesx() et imagesy()
2/ je crée une boucle qui parcourt toute l'image pixel par pixel et je récupère la couleur du pixel avec imagecolorat()
3/ je convertis la couleur en format HSL, je modifie la teinte et la saturation, je reconvertis la couleur en format RGB
4/ je redéfinis le pixel à l'aide de imagesetpixel()
5/ après que toute l'image ait été parcourue, je l'enregistre avec imagepng() et je la détruis avec imagedestroy()

Question:
Comment gagner en rapidité ? Y aurait-il un processus plus rapide ? Si oui, lequel ?
phcorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 23h07   #2
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
Salut,
tu dois pouvoir modifier directement la palette avec imagecolorset.
Par contre je pense que même en faisant comme ca, ca risque de demander pas mal de ressources du serveur si la couleur est changée trop vite. Faudrait peut-être bloquer les barres de temps en temps.
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2008, 18h04   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 26
Points : 11
Points : 11
Envoyer un message via MSN à phcorp Envoyer un message via Yahoo à phcorp Envoyer un message via Skype™ à phcorp
salut,
tu penses vraiment que ce serait plus rapide de modifier la palette directement ?
je vais essayer et je te donnes des nouvelles
phcorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2008, 18h20   #4
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 26
Points : 11
Points : 11
Envoyer un message via MSN à phcorp Envoyer un message via Yahoo à phcorp Envoyer un message via Skype™ à phcorp
voilà, je me suis creusé et j'ai abouti à ça :
Code :
1
2
3
4
5
6
7
8
9
10
$total = imagecolorstotal( $img );
for ( $i = 0; $i < $total; $i++ )
{
	$c = imagecolorsforindex( $img, $i );
	$red = $c['red'];
	$green = $c['green'];
	$blue = $c['blue'];
	/* Code de changement de couleur */
	imagecolorset( $img, $i, $red, $green, $blue );
}
et comme tu pourras le voir dans le preview en haut, ça ne fonctionne pas : l'image n'est pas modifiée...
Peux-tu m'aider ?
j'ai $total == 0
phcorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2008, 18h32   #5
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
T'as plus besoin de parcourir les pixels, normalement ceci devrait suffire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$r = 120;
$g = 120;
$b = 120;
if(isset($_GET['r'],$_GET['g'],$_GET['b']))	{
	$r = $_GET['r'];
	$g = $_GET['g'];
	$b = $_GET['b'];
}
$im = imagecreatefromgif('test.gif');
$index = imagecolorat($im,2,2);
imagecolorset($im, $index, $r, $g, $b);
 
header("Content-Type: image/png");
imagegif($im);
imagedestroy($im);
[edit] en fait il faut trouver l'index de la couleur source, car ce code marche en récupérant l'index de couleur d'un pixel.
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2008, 18h42   #6
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 26
Points : 11
Points : 11
Envoyer un message via MSN à phcorp Envoyer un message via Yahoo à phcorp Envoyer un message via Skype™ à phcorp
hey!
yon idée de ne modifier que la palette était absolument géniale !!!
j'ai réussi !!!
merci
phcorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/01/2008, 18h46   #7
Membre Expert
 
Avatar de Djakisback
 
Inscription : février 2005
Messages : 1 797
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 1 797
Points : 1 688
Points : 1 688
Ca donnerait un truc du style :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$r = 120;
$g = 120;
$b = 120;
if(isset($_GET['r'],$_GET['g'],$_GET['b']))	{
	$r = $_GET['r'];
	$g = $_GET['g'];
	$b = $_GET['b'];
}
$im = imagecreatefromgif('test.gif');
 
$total = imagecolorstotal( $im );
for ( $i = 0; $i < $total && !isset($index); $i++)	{
	$c = imagecolorsforindex( $im, $i );
	if($c['red'] == 0 && $c['green'] == 0 && $c['blue'] == 0)
		$index = $i;
}
 
imagecolorset($im, $index, $r, $g, $b);
 
header("Content-Type: image/png");
imagegif($im);
imagedestroy($im);
?>
Ce qui est bizzare c'est que normalement y a imagecolorresolve() qui est censé donner l'index directement mais j'ai essayé et ca ne foctionne pas.

[edit] T'as fait comment ? ^^
Djakisback est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2008, 19h16   #8
Candidat au titre de Membre du Club
 
Inscription : janvier 2007
Messages : 26
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 26
Points : 11
Points : 11
Envoyer un message via MSN à phcorp Envoyer un message via Yahoo à phcorp Envoyer un message via Skype™ à phcorp
normal, il faut que les couleurs de l'image soient indexées, ce qui dépend du format de ton image ( gif par exemple ça marche ), pour les autres ( images truecolor ) il faut créer une palette d'indexation des couleurs avec imagetruecolortopalette() mais l'inconvénient de celle-ci est qu'elle est en mode 256 couleurs donc les images sont moches. Le mieux c'est de préalablement convertir ton image en format gif
phcorp est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h55.


 
 
 
 
Partenaires

Hébergement Web