IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

Problème de détection des couleurs


Sujet :

SDL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Problème de détection des couleurs
    Bonjour à tous,

    Je sollicite votre aide après avoir fait de longues recherches sur internet .

    J’écris actuellement un code qui me servira dans le but de comparer la couleur d’un pixel donné d’une image avec tout les autres pixels de l’image.
    Dans le cas ou ces deux couleurs sont identiques, je change la couleur du deuxième pixel en noir.

    Par exemple si je prends une image de couleur uniforme et que je prend la couleur d’un pixel de cette image comme référence .
    Je parcours tout les pixel un à un de cette image, et si tout se passe bien mon image final devrait être entièrement noire.

    Dans mon cas , le problème est que lorsque je parcours les différents pixel de mon image, ceci influence les valeur de r,g,b .

    Dans mon code rond.png est un carré mauve uniforme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include "SDL_image.h"
     
    int main (int argc, char ** argv )
    {
        Uint8 r, g, b;
        Uint8 re,gre,blue;
        SDL_Surface *img=NULL;
        int i,taille;
        Uint32 couleur,echantillon;
     
        img=IMG_Load("images/rond.png");
        SDL_GetRGB(*(Uint32*)img->pixels+10, img->format, &re, &gre, &blue);
        echantillon=SDL_MapRGB(img->format,re,gre,blue);
        fprintf(stderr, " %d %d %d ",re,gre,blue);
    /* ici je crée ma couleur de référence, JE CHOISI UN PIXEL DE COORDONNES 0,10 ET JE RECUPERE LES VALEURS DE redref,blueref,greenref 
     
    Mais la je rencontre un problème si je prend un pixel de coordonnées 
     0,11 blueref va s’incrémenter de 1,
     c’est pourquoi dans ma boucle if seul 
    un pixel de même couleur est détecté */
     
        couleur=SDL_MapRGB(img->format,9,9,9);
        taille=img->w*img->h;
        for(i=0;i<taille;i++)
        {
            SDL_GetRGB(*(Uint32*)img->pixels+i, img->format, &r,&g,&b);
            if(r==re && g==gre && blue==b){
              *( (Uint32*)img->pixels+i) =couleur;fprintf(stderr,"+");}
     
    // fprintf me permet d afficher le nombre d’entrée dans la boucle
    // même si je peux vérifier sur l’image finale que les pixel ont bien été modifié
        }
        SDL_SaveBMP(img, "image.png");
     
    //résultat l image modifie n est pas noire, seul le pixel de coordonnées 0,10 est modifié
     
        return 0;
    }

    J’ai aussi essayer ce bout de code sur la fin qui ne marche pas non plus on ne rentre même pas une fois dans le if une seule fois l image reste intacte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        for(i=0;i<taille;i++)
        {
            if(*( (Uint32*)img->pixels+i)==echantillon)
     
                *( (Uint32*)img->pixels+i) =couleur;
        }
    J‘ai déjà utilisé GetRGB pour ce genre de manipulation mais cette fois-ci je coince vraiment.

    J’espère avoir votre aide car j’ai vraiment tout essayé j’ai essayer de coller l image sur un écran pour comparer les couleurs de mon image, sans résultat.
    Merci d’avance

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Déjà en sortie... es-tu sûr que SaveBMP peut générer du PNG ?
    Quelques sites disent que non, il faut tricker un peu...

    Le PNG a également une couche de transparence... SDL est censé pouvoir gérer ça, mais j'ai un souvenir qu'un paramètre des fonctions sert à ça...
    A tout hasard, as-tu testé avec un BMP simple pour vérifier si la logique de ton code fonctionne ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    Bonjour ,

    merci de ta réponse alors j'ai déjà essayer avec png, bmp et jpg et toujours le même souci.
    Le save du png marche bien chez moi.

    Par contre je n'était pas au courant pour le couche de transparence.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2013
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2013
    Messages : 16
    Points : 9
    Points
    9
    Par défaut
    j'ai finalement trouvé ma réponse encore merci voici le code
    et le liens que l'on m'a communiqué sur un autre forum.

    Merci j' ai finalement décidé de repasser tout en bmp, c'est plus précis.

    http://sdl.beuc.net/sdl.wiki/Pixel_Access

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include "SDL_image.h"
     
     
    Uint32 getpixel(SDL_Surface *surface, int x, int y);
     
    int main (int argc, char ** argv )
    {
        int i,j;
        SDL_Surface *img=NULL;
        Uint32 couleur,echantillon;
        img=IMG_Load("images/rond.bmp");
     
        echantillon=getpixel(img,80,80);
     
        couleur=SDL_MapRGB(img->format,0,255,9);
     
     
        for(i=0;i<img->h;i++)
            for (j=0; j<img->w; j++)
        {
            if(echantillon==getpixel(img,j,i))
                *( (Uint32*)img->pixels+(img->h*i)+j) =couleur;
        }
        SDL_SaveBMP(img, "image.bmp");
        return 0;
    }
     
    Uint32 getpixel(SDL_Surface *surface, int x, int y)
    {
        int bpp = surface->format->BytesPerPixel;
        /* Here p is the address to the pixel we want to retrieve */
        Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
     
        switch(bpp) {
            case 1:
                return *p;
                break;
     
            case 2:
                return *(Uint16 *)p;
                break;
     
            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;
                break;
     
            case 4:
                return *(Uint32 *)p;
                break;
     
            default:
                return 0;       /* shouldn't happen, but avoids warnings */
        }
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] problème de détection des accents
    Par benoitB dans le forum Langage
    Réponses: 1
    Dernier message: 01/01/2008, 23h43
  2. Problème de représentation des couleurs
    Par Bubleyack dans le forum Imagerie
    Réponses: 4
    Dernier message: 12/06/2007, 17h38
  3. [office]problème d'affichage des couleurs
    Par doc_nounours dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 09/07/2006, 11h18
  4. Réponses: 1
    Dernier message: 22/02/2006, 10h56
  5. [ImageMagick] Détection des couleurs approximative d'une image ?
    Par SkyDev dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 18/01/2006, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo