
| Page 1 2 Suivante | |
| Pseudo | Commentaire |
|---|---|
| Page 1 2 Suivante | |
Skydreamer
|
# Posté le 02/04/2006 à 10:20:12 |
![]()
Ville : Thionville |
c'est trop super ! je met 20
|
Christopher
|
# Posté le 02/04/2006 à 12:57:41 |
![]()
é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...
![]() 4IM, école d'ingénierie informatique et management, formation des Ingénieurs Managers en Informatique. |
Piwaï
|
# Posté le 02/04/2006 à 14:27:15 |
|
Why can't we be friend ?
é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. |
Inso
|
# Posté le 02/04/2006 à 20:44:56 |
![]()
études : IUT Vannes |
Joli travail !!
Grace à toi, il est enfin possible de créer un minilogiciel de retouche d'images !!
|
Gni
|
# Posté le 20/04/2006 à 13:24:27 |
scroll, le jeu![]()
études : INSA Strasbourg |
Franchement chapeau!
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 !
|
Piwaï
|
# Posté le 22/04/2006 à 12:58:32 |
|
Why can't we be friend ?
études : INSA Rouen |
Merci . 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. |
Le N@in Vert
|
# Posté le 11/05/2006 à 19:42:09 |
Il est urgent de rire !![]()
é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) |
Piwaï
|
# Posté le 11/05/2006 à 19:52:09 |
|
Why can't we be friend ?
é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. |
Le N@in Vert
|
# Posté le 11/05/2006 à 20:25:54 |
Il est urgent de rire !![]()
études : EFREI |
Je pourai pas tester avant dans plusieur semaine mais ok merci pour l'explication
|
socomajor
|
# Posté le 25/05/2006 à 17:18:54 |
Be AWARE !![]()
|
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 |
Séraphin
|
# Posté le 08/06/2006 à 13:09:53 |
|
Y'en a jamais a C!
|
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).
![]() |
Piwaï
|
# Posté le 09/06/2006 à 11:02:48 |
|
Why can't we be friend ?
é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. |
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 A+ HazardMan |
Piwaï
|
# Posté le 17/06/2006 à 15:53:41 |
|
Why can't we be friend ?
é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. |
jo_le_coco
|
# Posté le 31/07/2006 à 14:59:09 |
![]()
|
Bravo pour le tuto Allez, 12... non... 13... euh... bon allez 20/20, ne soyons pas mesquins
|
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 ) 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 !!!! |
Piwaï
|
# Posté le 27/08/2006 à 16:04:32 |
|
Why can't we be friend ?
é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. |
gregagne
|
# Posté le 29/08/2006 à 15:54:14 |
deteste les sms, aime python!![]()
|
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 ![]() ![]() |
timmy
|
# Posté le 05/09/2006 à 14:05:03 |
![]()
|
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. |
Piwaï
|
# Posté le 05/09/2006 à 17:35:09 |
|
Why can't we be friend ?
é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. |
timmy
|
# Posté le 10/09/2006 à 21:53:02 |
![]()
|
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; } @+ |
Piwaï
|
# Posté le 12/09/2006 à 12:04:40 |
|
Why can't we be friend ?
é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. |
Tim...
|
# Posté le 08/10/2006 à 12:46:16 |
C'est grand un cheval...![]()
|
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* |
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 ) |
Agent-H
|
# Posté le 18/09/2007 à 21:16:51 |
boum![]()
Ville : Fortschwihr |
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 .ps : timmy--> désolé de te décevoir mais SDL_gfx se charge déja de faire du zoom sur des images. |
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
et la deusième : Code : C - Afficher / masquer les numéros de ligne
cette dernière va de paire avec : Code : C - Afficher / masquer les numéros de ligne
Pourais-tu me les expliquer? Sinon je met 20 pour un tuto très utile! |
Peki
|
# Posté le 02/03/2008 à 13:54:30 |
![]()
|
Citation Je vous propose donc d'utiliser ces fonctions comme des boites noires . 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.
|
landeguy
|
# Posté le 03/03/2008 à 11:23:30 |
|
Ou pas!
|
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) ![]() |
Fairvel des MabDues
|
# Posté le 01/04/2008 à 13:22:18 |
Quis custodies ipsos custodiet![]()
|
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é ) ...Ciao |
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
|
Le Site du Zéro vous proposera bientôt de nouveaux cours partant de Zéro dans d'autres domaines que l'informatique !

