Traiter une image + l'enregistrer sur un serveur

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Traiter une image + l'enregistrer sur un serveur

par sadeq » 20 juil. 2007, 00:52

Voici ma p'tite contribution comme exemple selon la proposition de Sékiltoyai: un script qui analyse une image gif, pixel par pixel, determine le code RGB de sa couleur et affiche le résultat sous forme de tableau.

ça pourrait t'aider à comprendre le principe du codage des couleurs qui selon la bibliothèque GD2 consiste à dire: Un point x/y a une couleur dont l'index est récupéré par imagecolorat(). Cet index correspond à une liste couleurs RGBA (rouge, vert, bleu et alpha) que la fonction imagecolorsforindex() peut récupérer. Ce qui nous donne les infos pour connaitre les taux de mélange des couleurs de base RGBA.
<pre>
<?php 
//source de l'image d'origine
$image[file] = "image_test.gif";
//lire le contenu de l'image
if (!file_exists($image[file])) {echo "Le fichier de l'image est introuvable!"; exit;}
//transformer le contenu lu en objet image GD
$image[pixels] =  imagecreatefromgif($image[file]);
//Obtenir la largeur et la hauteur de l'image
$image[width] = imagesx($image[pixels]);
$image[heigth] = imagesy($image[pixels]);
//Parcourir l'image en largeur et en hauteur pour obtenir pixel par pixel
for($y = 0; $y < $image[heigth]; $y++) {
	for($x = 0; $x < $image[width]; $x++) {	
		//obtenir la couleur du pixel x/y
		if (($image[$y][$x][color][code] = imagecolorat($image[pixels],$x,$y))){
			//en déduire les couleurs RGB + Alpha
			$image[$y][$x][color][rgba] = imagecolorsforindex($image[pixels], $image[$y][$x][color][code]);
			//centraliser les pixels par couleur
			if ($image[$y][$x][color][rgba][red] > 0) $color[red][] = array("x"=>$x, "y"=>$y);
			if ($image[$y][$x][color][rgba][green] >0) $color[green][] = array("x"=>$x, "y"=>$y);
			if ($image[$y][$x][color][rgba][blue] >0) $color[blue][] = array("x"=>$x, "y"=>$y);
		}
	}
}
//voir le résultat
echo "<h5>Analyse des couleurs de l'image '$image[file]' par pixel</h5>";
print_r($image);
echo "<h5>Synthèse des pixels par couleur RGB</h5>";
print_r($color);
?>
</pre>

par Sékiltoyai » 19 juil. 2007, 23:21

Tout d'abord tu dois faire un système te permettant de ne générer le fichier que si nécessaire.
Tu as plusieures solutions :
1) Tu dois avoir un serveur SQL avec une table du style :
champ id INT AUTO_INCREMENT PRIMARY
champ date TIMESTAMP INDEX
Dans un seul fichier, tu te connectes à une base de données ( vois du côté de mysql_connect() et mysql_select_db() ), tu fais une requète avec mysql_query() pour récupérer le timestamp supérieur à la dernière mise à jour (je suppose que tu as exactement les horaires de mise à jour). Si tu trouves un résultat, ca veut dire que tu as déjà le fichier, sinon, il faut le générer. Et par commodité, tu peux appeler le fichier image_$timestamp.gif.
2) En plus simple, tu peux aussi vérifier directement si le fichier image_$timestamp.gif avec file_exists() en utilisant la date théorique de la mise à jour.
3)...

Ensuite, si tu dois regénérer le fichier, tu le télécharges avec file_get_contents(), tu utilises imagecreatefromstring() pour obtenir une ressource exploitable par les fonctions d'image, tu parcours l'image (pour en connaître les bornes, tu as getimagesize() ), tu récupère la couleur de l'index courant avec imagecolorat() et tu le fixes avec imagesetpixel(). Tu écris enfin l'image avec imagegif(), puis tu l'envoies vers le navigateur avec la même fonction.

Je comprend que cela peut paraître compliqué, mais il suffit de diviser les problèmes.

par marcrem » 19 juil. 2007, 21:22

étant completement débutant en PHP, j'aimerais avoir une certaine base pour pouvoir faire ceci... Je ne prévois pas créer de grosses applications en PHP, donc je crois qu'une base résumée ferait l'affaire... J'aimerais savoir comment créer ceci si j'ai un serveur avec le PHP installé?

Comment je dois structurer les 4 étapes? Tout cela dans un seul fichier PHP ? Désolé. mais je part vraiment de zéro pour ce projet..

par Sékiltoyai » 19 juil. 2007, 20:39

Pour se faire, tu auras besoin des fonctions suivantes :
file_get_contents()
imagecreatefromstring()
imagesetpixel() (Il y a peut être mieux, à toi de chercher)
imagegif()

Et pour faire ca toutes les 10 minutes, tu dois enregistrer dans ta base de données la dernière mise à jour et tester si elle est valide, si elle ne l'est pas, tu regénères le fichier.

Voilà, tu as tout.

Traiter une image + l'enregistrer sur un serveur

par marcrem » 19 juil. 2007, 20:20

Bonjour,

Est-il possible avec PHP de récupérer une image sur un serveur (L'image change au 10 min donc le script doit la prendre d'internet) puis de la traiter de la facon suivante:

- Supprimer toutes les couleurs SAUF une 15aine de couleurs précises
- Enregistrer le résultat sur un serveur sous forme d'image GIF
- Recommencer à chaque 10 minutes

Merci!