Aller au menu - Aller au contenu

Modifier une image pixel par pixel


Pour accéder à cette section
Connectez-vous !
connexion_rpx
Page 1  2  Suivante
Pseudo Commentaire
Page 1  2  Suivante
Hors ligne Skydreamer # Posté le 02/04/2006 à 10:20:12
Avatar

Ville : Thionville
Pays : France métropolitaine

c'est trop super ! je met 20

Développeur et graphiste du site des zCorrecteurs :)
zCorrecteurs.fr
 
Hors ligne Christopher # Posté le 02/04/2006 à 12:57:41
Avatar

études : IIMM Groupe 4

C'est un très bon sujet pour un tuto C/C++, mais il manque un peut de détails pour tes fonctions... ;)


Image utilisateur

4IM, école d'ingénierie informatique et management, formation des Ingénieurs Managers en Informatique.
 
Hors ligne Piwaï # Posté le 02/04/2006 à 14:27:15
Why can't we be friend ?
Avatar

études : INSA Rouen

Merci. Sinon, tu voudrais plus de détails à quel niveau pour les fonctions ?

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne Inso # Posté le 02/04/2006 à 20:44:56
Avatar

études : IUT Vannes

Joli travail !!

Grace à toi, il est enfin possible de créer un minilogiciel de retouche d'images !! :D


Image utilisateur
 
Hors ligne Gni # Posté le 20/04/2006 à 13:24:27
scroll, le jeu
Avatar

études : INSA Strasbourg

Franchement chapeau! :soleil:
C'est très bien fait, c'est bien expliqué et tout et tout....

Mais c'est vrai que les deux fonctions que tu nous livres comme ca en disant qu'elle sont trop compliquées pour être expliquées c'est un peu difficile à avaler pour des zéros comme nous.

Mais je le redis : c'est du beau travail ;) !

Image utilisateur


 
Hors ligne Piwaï # Posté le 22/04/2006 à 12:58:32
Why can't we be friend ?
Avatar

études : INSA Rouen

Merci :D . Pour les fonctions, j'avoue que je les ai lachées comme ca, mais c'est aussi parce que je n'ai pas encore les connaissances suffisantes pour expliquer précisement leur fonctionnement. Je vais bientôt faire un EDIT pour expliquer plus précisément leur fonctionnement, et aussi donner un exemple de modification de la couche alpha.

Modifier une image pixel par pixel, ca peut paraitre totalement inutile... Perso, ca me sert énormement en ce moment pour un de mes projets en maths, pour faire des statistiques sur des images...

@++

Piwaï

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne Le N@in Vert # Posté le 11/05/2006 à 19:42:09
Il est urgent de rire !
Avatar

études : EFREI

si ça c'est du C++ qu'est ce qu'est le C ??? sa y ressemble vachement ...
c'est juste les nouvelle que tu nous a apprise fonction qui sont en c++ ???
par ce que sinon je voie pas ou est le c++ expliquer moi svp je fait pas bien la nuance

sinon c'est parfait tes cour son bien structuré et tout juste si tu pouvait commenté un peut plus les 2 premiers code bien que les autres soit très bien commenté
je te met 16/20 (ce qui est pas mal par ce que je saque plus que certain qui note de 10 a 20)
 
Hors ligne Piwaï # Posté le 11/05/2006 à 19:52:09
Why can't we be friend ?
Avatar

études : INSA Rouen

Dans le code que je vous ai donné, il n'y a pas de réelles différences entre C++ et C.

Et la plupart des compilateurs ne vous feront pas sentir la différence. Ce que je voulais dire en fait, c'est que mon code a été testé avec un compilateur C/C++, je ne lui ai pas demandé de faire la distinction, donc je n'aurai éventuellement pas pu relever du code non valide en C et valides en C++.

En fait, il est probable que l'intégralité du code soit compatible C. Et je n'ai pas du tout utilisé les concepts de programmation Objet.

A toi de tester le code et me dire s'il est validé en C ;) .

Pour les deux premiers code, les commenter est un de mes objectifs, mais il faut que je me documente encore un peu sur la question... C'est pas évident :)

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne Le N@in Vert # Posté le 11/05/2006 à 20:25:54
Il est urgent de rire !
Avatar

études : EFREI

Je pourai pas tester avant dans plusieur semaine mais ok merci pour l'explication
 
Hors ligne socomajor # Posté le 25/05/2006 à 17:18:54
Be AWARE !
Avatar

Bravo ! Je vais me lancer dans la redaction d'une fonction de rotation :) je te tiendrais au courrant comme tu le demandes ^^ Très bon tuto !

J'ai juste du mal à comprendre l'integralitré de tes 2 fonctions, un peu quand même quoi lol !

Bonne continuation !

Socomajor
 
Hors ligne Séraphin # Posté le 08/06/2006 à 13:09:53
Y'en a jamais a C!
Avatar

Pour ceux que ça intéresse, voila le code de balance des couleurs qui compile en C :

Code : C
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
/* ********************************************************************* */
//Prototypes
//Les commentaires sont dans les corps de fonction.
void waitAndQuit(void);
void BalanceDesCouleurs(SDL_Surface* surface, int rAjout, int gAjout, int bAjout);
Uint8 addVal(Uint8 composante,int);
Uint32 getPixel(SDL_Surface* surface, int x, int y);
void setPixel(SDL_Surface* surface, int x, int y, Uint32 pixel);
/* ********************************************************************* */
//Fonction principale
int main(int argc, char** argv)
{
        //On créé les deux surfaces qui vont nous servir :
        //L'écran, et l'image à afficher
        SDL_Surface *ecran = NULL, *image = NULL;

        //Pour positionner les images
        SDL_Rect position;

        //On initialise la SDL.
        SDL_Init(SDL_INIT_VIDEO);

        //On initialise l'écran
        ecran = SDL_SetVideoMode(600, 200, 32,  SDL_ANYFORMAT |
                                            SDL_HWSURFACE );

        //On change le titre de la fenêtre
        SDL_WM_SetCaption("Modification d'une image pixel par pixel : balance des couleurs", NULL);

        //On charge notre image
        image = SDL_LoadBMP("image.bmp");

        //Position de l'image originale dans l'écran.
        position.x = 0;
        position.y = 0;
        //On copie l'image originale dans l'écran
        SDL_BlitSurface(image, NULL, ecran, &position);

        //On modifie l'image originale
        BalanceDesCouleurs(image, -50, 20, 0);
        //Position de la nouvelle image, pour ne pas être collée par dessus l'originale
        position.x = 200;
        position.y = 0;
        //On copie la nouvelle image dans l'écran
        SDL_BlitSurface(image, NULL, ecran, &position);

        //On remodifie encore l'image déjà modifiée
        BalanceDesCouleurs(image, 0, -80, 100);
        position.x = 400;
        position.y = 0;
        SDL_BlitSurface(image, NULL, ecran, &position);

        SDL_Flip(ecran);/* Force l'affichage. Facultatif ici, mais on ne sait jamais.*/

        waitAndQuit(); //Permet de voir le résultat de nos efforts

        return EXIT_SUCCESS; //Jamais atteint car waitAndQuit(); fait quitter le programme.
}
/* ********************************************************************* */
//Fonction permettant d'attendre que l'utilisateur quitte le programme
void waitAndQuit(void)
{
        SDL_Event event;

        while (SDL_WaitEvent (&event)) //Boucle infinie
        {
                switch(event.type)
                {
                        case SDL_QUIT :
                                SDL_Quit();
                                exit(0); //On quitte le programme.
                                //Bon, j'ai pas utilisé FreeSurface, donc c'est pas propre.
                                //Mais c'est un exemple :)
                }
        }
}

/* ********************************************************************* */
/*Balance des couleurs : permet d'ajouter ou d'enlever de la couleur à toute l'image.
Paramètres :
SDL_Surface *surface : la surface à modifier
int rAjout : La quantité de rouge que l'on veut ajouter ou soustraire (entre -255 et +255)
int gAjout : La quantité de vert que l'on veut ajouter ou soustraire (entre -255 et +255)
int bAjout : La quantité de bleu que l'on veut ajouter ou soustraire (entre -255 et +255)
*/

void BalanceDesCouleurs(SDL_Surface* surface, int rAjout, int gAjout, int bAjout)
{
        /*x et y sont les index permettant de se déplacer dans l'image*/
        int x, y;
        /* r,g,b,a vont stocker les composantes d'un pixel*/
        Uint8 r, g, b, a;
        /* pixel stocke le code couleur d'un pixel*/
        Uint32 pixel;

        /* On bloque la surface pour pouvoir travailler dessus */
        SDL_LockSurface(surface);
        //Double boucle pour parcourir l'intégralité de l'image.
        for (y=0 ; y < surface->h ; y++)
        {
                for (x=0 ; x < surface->w ; x++)
                {
                        //On récupère le code couleur du pixel.
                        pixel=getPixel(surface, x, y);
                        //On extrait les composantes rouge, vert, bleu et alpha
                        SDL_GetRGBA(pixel, surface->format, &r, &g, &b, &a);

                        //On ajoute/soustrait la quantité voulue aux 3 composantes rouge, vert, bleu.
                        r = addVal(r, rAjout);
                        g = addVal(g, gAjout);
                        b = addVal(b, bAjout);

                        /* On rétransforme les 4 composantes en un seul code couleur dans pixel */
                        pixel=SDL_MapRGBA(surface->format, r, g, b, a);
                        /* On injecte le code couleur pixel dans le pixel correspondant*/
                        setPixel(surface, x, y, pixel);
                }
        }
        /* La surface peut désormais être réutilisée pour autre chose*/
        SDL_UnlockSurface(surface);
}
/* ********************************************************************* */
//Pour ajouter une certaine valeur à une composante
//En restant dans l'intervalle [0,255]
Uint8 addVal(Uint8 composante, int valeur)
{
        int tampon; //Variable entière qui sert de tampon
        tampon = composante + valeur;

        /* On fait en sorte que tampon reste dans l'intervalle [0,255] */
        if (tampon > 255)
        {
                tampon = 255;
        }
        else if (tampon < 0)
        {
                tampon = 0;
        }
        /* Avec l'opérateur cast (Uint8) on tranforme tampon en un entier de type Uint8*/
        return composante = (Uint8) tampon;
}
/* ********************************************************************* */
//Pour récupérer la couleur d'un pixel
//Ce code n'est pas commenté car trop complexe.
Uint32 getPixel(SDL_Surface* surface, int x, int y)
{
        int bpp = surface->format->BytesPerPixel;
        /* Ici p est l'adresse du pixel que l'on veut connaitre */
        Uint8 *p = (Uint8*) surface->pixels + y * surface->pitch + x * bpp;


        switch(bpp)
        {
                case 1:
                        return *p;

                case 2:
                        return (Uint16) *p;

                case 3:
                        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                                return p[0] << 16 | p[1] << 8 | p[2];
                        else
                                return p[0] | p[1] << 8 | p[2] << 16;

                        case 4:
                                return (Uint32) *p;

                        default:
                                return 0; /* Ne devrait pas arriver, mais évite les erreurs */
        }
 }
/* ********************************************************************* */
//Pour modifier la couleur d'un pixel
//Ce code n'est pas commenté car trop complexe.
void setPixel(SDL_Surface* surface, int x, int y, Uint32 pixel)
{
        int bpp = surface->format->BytesPerPixel;
        /* Ici p est l'adresse du pixel que l'on veut modifier */
        Uint8 *p = (Uint8*) surface->pixels + y * surface->pitch + x * bpp;


        switch(bpp)
        {
                case 1:
                        *p = pixel;
                        break;

                case 2:
                        (Uint16) *p = pixel;
                        break;

                case 3:
                        if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
                        {
                                p[0] = (pixel >> 16) & 0xff;
                                p[1] = (pixel >> 8) & 0xff;
                                p[2] = pixel & 0xff;
                        }
                        else
                        {
                                p[0] = pixel & 0xff;
                                p[1] = (pixel >> 8) & 0xff;
                                p[2] = (pixel >> 16) & 0xff;
                        }
                        break;

                case 4:
                        (Uint32) *p = pixel;
                        break;
        }
 }



Les modifications que j'ai faites concernent la fonction 'addVal' qui est maintenant plus logique (pas de pointeurs inutiles) et les prototypes des fonctions. (J'ai aussi simplifié le cast dans les fonctions set et get pixel).

Image utilisateur
Image utilisateur
Image utilisateur
Image utilisateur
 
Hors ligne Piwaï # Posté le 09/06/2006 à 11:02:48
Why can't we be friend ?
Avatar

études : INSA Rouen

Effectivement, pour le coup de addval, c'est bien parce que ca permet de le compiler en C.

dans les setpixel et getpixel, j'ai vu tes modifs, mais en fait j'ai pas trop capté. Tu pourrais m'expliquer ce que tu as fait, en fait, et pourquoi ?

Merci pour ta contribution !!

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne BioHazardman # Posté le 16/06/2006 à 21:38:04
Par tout les temps !

Génial ! Exactement le genre de tuto que je cherchait...

J'ai déja une autre idée d'effet à pouvoir ajouter : inverser les couleur.
C'est simple à mettre en place : on récupère la valeur de chaque canal de couleur, on le soustrait à 255 (pour une image à 8 Bits) et on inscit...
Je vais le faire et puis je renvois la source.

Au fait :
Secret (cliquez pour afficher)
20/20 :soleil:


A+
HazardMan
 
Hors ligne Piwaï # Posté le 17/06/2006 à 15:53:41
Why can't we be friend ?
Avatar

études : INSA Rouen

Bonne idée, c'est interessant ;) .

Moi même, je suis en train de me servir de mon propre tuto pour mon projet de stats, ca me permet de faire des stats sur des images...

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne jo_le_coco # Posté le 31/07/2006 à 14:59:09
Avatar

Bravo pour le tuto :) Allez, 12... non... 13... euh... bon allez 20/20, ne soyons pas mesquins :D
Hors ligne el_rere # Posté le 22/08/2006 à 22:12:56
Atom Heart Mother

Salut à tous !!!
Après lecture de ton tuto et comme j'en avais besoin, je me suis lancé dans la réalisation des rotations, mais un problème c'est posé à moi, les fonctions SDL_GetPixel et SDL_PutPixel ne peuvent prendre des coordonnées négatives et/ou décimales, donc ce n'est malheureusement pas vrai que l'on puisse faire des rotations avec ces fonctions :'( !!!
Sinon, excellent tuto, qui ma été (mis à part pour mes fameuses rotations :D ) très utile !!
Je mets 19 pour le faux-espoir (non c'est pas vrai, j'ai mis 20 ;) ).


Pink Floyd | Scorpions | Dire Straits | AC/DC | Queensrÿche
Et pleins d'autres encore :p !!!!
 
Hors ligne Piwaï # Posté le 27/08/2006 à 16:04:32
Why can't we be friend ?
Avatar

études : INSA Rouen

Hum, merci pour la note, par contre je pense que tu as tord pour les rotations, c'est réalisable.

En SDL, une surface est TOUJOURS un rectangle.

Quand tu veux faire une rotation, il faut créer une nouvelle image, vide, qui sera peut etre plus grande que l'image source. Il faut prévoir suffisament de place pour ne pas avoir à placer des pixels négativement (ce qui n'a pas de sens). Cela ne doit pas être trop compliqué, c'est à voir..

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne gregagne # Posté le 29/08/2006 à 15:54:14
deteste les sms, aime python!
Avatar

19/20 bravo, le seul problème c'est qu'il soit en C++ mais bon pas grave
Secret (cliquez pour afficher)
en vrai, j'ai mis :-° 20 :lol:

Image utilisateurImage utilisateur
 
Hors ligne timmy # Posté le 05/09/2006 à 14:05:03
Avatar

Salut piwai, très bon tuto, qui donne des bases pour s'essayer à l'édition d'image, même si le plus dur reste à trouver les algorithmes pour modifier tous ces pixels.

J'essaye justement de faire un programme qui réduise automatiquement des photos prisent avec un numérique en qualité max, en photos plus petites ( qui ne dépassent pas la taille de l'écran ).

Mon idée de départ est de retirer des lignes et des colonnes ( par exemple une sur trois ) en espérant que ça ne détériore pas trop l'image. Mais j'y crois pas trop.
Sinon, pour supprimer une ligne, je fais la moyenne de deux lignes. Mais là encore je n'y crois pas trop.

As-tu déjà essayé ? As-tu une autre idée à me proposer ?

Si tu as le temps de faire un big tuto avec un type de modification par mini tuto ... n'hésite pas !

Bonne continuation

PS : J'ai trouvé un site qui explique pas mal d'algo pour faire des filtres : http://tuxy2885.free.fr/index.php?cat=tutorial&id=graphics. De quoi bien s'amuser.
Hors ligne Piwaï # Posté le 05/09/2006 à 17:35:09
Why can't we be friend ?
Avatar

études : INSA Rouen

Je ne me suis jamais vraiment penché sur les zooms, mais bon, je vais te dire ce qui me passe par la tete :

Ton idée de retirer des lignes n'est pas une mauvaise idée, et ca peut marcher. Ca ne sera peut etre pas de la meilleure qualité, mais ca peut marcher.

Voici une idée sinon comment je verrai la chose :

Tu commence par calculer les coefficients de largeur et longueur, c'est à dire par exemple, si l'original fait

1000* 1000 et le petit fait 100*200 (réduction et étirement), tes coeff sont 10 et 5.

Ensuite, chaque pixel du petit correspond en fait a plusieurs pixels de l'original. Donc, chaque pixel du petit doit avoir comme couleur la moyenne des pixels correspondant sur l'original. Grace au coefficient précedemment calculé, quelques calculs et quelques boucles, tu devrais t'en sortir...

Ca va en faire des boucles...

Je ne donne pas plus de détail car je n'ai pas testé cette méthode, si tu ne comprends po, di le moi, je préciserai :) .

@++

Piwaï

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne timmy # Posté le 10/09/2006 à 21:53:02
Avatar

J'ai essayé ma méthode en retirant une ligne et une colonne sur deux et ça donne un très bon rendu !

Par contre j'ai rencontré un problème avec les fonctions que tu nous as fourni :
quand getPixel extrait un pixel, il inverse le rouge et le bleu ( mon image est en 3 bpp, et apparement SDL_BYTEORDER != SDL_BIG_ENDIAN, mais il faudrait que si ... ).

voilà mon code si tu veux essayer.

Code : C
/* on donne en argument le pointeur vers l'image que l'on a chargé
   et on récupère le pointeur vers la nouvelle image redimensionnée */

SDL_Surface* resize(SDL_Surface* image)
{
    int i,j,x,y = 0;
    Uint32 pixel;
    // je crée ma surface aux bonnes dimensions
    SDL_Surface* img = SDL_CreateRGBSurface(SDL_SWSURFACE,image->w/2,image->h/2,32,0,0,0,0);
   
    // je bloque les deux images
    SDL_LockSurface(image);
    SDL_LockSurface(img);
   
    // je prend une ligne et une colonne sur deux
    for (j=0;j < image->h;j = j+2) {
        x=0;
        for (i=0;i < image->w;i = i+2) {
            pixel = getPixel(image,i,j);
            setPixel(img,x,y,pixel);
            x++;
        }
        y++;
    }
   
    // je débloque les images
    SDL_UnlockSurface(img);
    SDL_UnlockSurface(image);
    // je libère la surface initiale
    SDL_FreeSurface(image);

    return img;
}


@+
Hors ligne Piwaï # Posté le 12/09/2006 à 12:04:40
Why can't we be friend ?
Avatar

études : INSA Rouen

Ok, as tu essayé avec un autre format d'image, ca marche ?

http://www.piwai.info
"La violence est le dernier refuge de l'incompétence". Isaac Asimov, Fondation.
Créateur de 2H4U : Too Hard For You et découvrez aussi BisouLand.
 
Hors ligne Tim... # Posté le 08/10/2006 à 12:46:16
C'est grand un cheval...
Avatar

J'adore ce tuto, j'trouve ça super utile :) .

Si vous voulez un petit exercice interressant y a ça : Cacher une image dans une autre image.

J'trouve que c'est pas mal, par contre y faut manipuler du binaire donc c'est un peu plus dur.

Secret (cliquez pour afficher)
*Très bonne note*
 
Hors ligne ironzorg # Posté le 01/07/2007 à 14:33:55

Citation : wx
http://tuxy2885.free.fr/index.php?cat=tutorial&id=graphics


Tres bon lien, merci :)

En revanche, je met 15 au tuto car il n'y a aucun exercice d'application proposé avec une correction ( du style: prendre une image et faire tendre les pixels de cette image vers le noir ou le blanc )

Image utilisateur Image utilisateur
 
Hors ligne Agent-H # Posté le 18/09/2007 à 21:16:51
boum
Avatar

Ville : Fortschwihr
Pays : France métropolitaine

Très bien Parfait !!
En plus de savoir modifier des images, ce tuto nous permet de mieu comprendre les bits & cie et par la même occasion peut aussi servir a comprendre et a faire du pixel perfect :D .

ps : timmy--> désolé de te décevoir mais SDL_gfx se charge déja de faire du zoom sur des images.
 
Hors ligne brastir # Posté le 14/02/2008 à 10:17:18

Parfait. Grace à ce tuto mon problèmeest résolue!
dans tes deux fontcion il n'y a que trois lignes que je ne comprends pas :
Code : C - Afficher / masquer les numéros de ligne
  1. Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * nbOctetsParPixel;

et la deusième :
Code : C - Afficher / masquer les numéros de ligne
  1. return p[0] << 16 | p[1] << 8 | p[2];

cette dernière va de paire avec :
Code : C - Afficher / masquer les numéros de ligne
  1. return p[0] | p[1] << 8 | p[2] << 16;


Pourais-tu me les expliquer?
Sinon je met 20 pour un tuto très utile!
Hors ligne Peki # Posté le 02/03/2008 à 13:54:30
Avatar

Citation
Je vous propose donc d'utiliser ces fonctions comme des boites noires :euh: . On se fiche de savoir comment elles fonctionnent, du moment qu'elles marchent autant s'en servir.


C'est dommage de ne pas éxpliquer plus en détail les deux fonctions principale alors que c'est sur çela que repose le thème. :(
Hors ligne landeguy # Posté le 03/03/2008 à 11:23:30
Ou pas!
Avatar

Super tuto, PARFAIT. (en plus, je me lance dans le cod'art et c'est PILE ce dont j'avais besoins) ^^ .
Maintenant, on peut même faire des retoucheurs d'image (enfin, bon, reste pas mal de code a coder :) .
je met 19.
Ton code est très claire, bravo.

Je suis en tain de faire un Zelda ammateur, si vous etes interresse(e) pour y participer envoyez moi un MP (je vais bientot en faire un topic) ^^
 
Hors ligne Fairvel des MabDues # Posté le 01/04/2008 à 13:22:18
Quis custodies ipsos custodiet
Avatar

Salut Piwaï,
j'avais testé les fonctions putpixel() et getpixel() de la docu de SDL, mais j'avais besoin d'éclaircissements. J'apprécie ton aide !
Il reste à comprendre un poil plus en profondeur (le concept de pitch de la surface), mais cela reste très clair.
C'est ce que j'adore en info ... une fois abordés sereinement, les concepts deviennent très simples !

Je mets pas 20, car sinon tu vas croire que tu es parfait et tu vas arrêter d'évoluer ... et puis j'aime pas donner de notes de toute manière (bien que tu auras comprsi que j'ai énormément aimé :D ) ...

Ciao
Hors ligne Mrpsychopathe # Posté le 30/05/2008 à 18:03:27

Super Tuto !


C'était un point important qui n'était pas expliqué dans le tuto de Mathéo21. Le tuto est très bien expliqué et tout.
Très bon tutoriel.

19/20

Aucun tuto n'est parfait :p
Pour accéder à cette section
Connectez-vous !
connexion_rpx