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 :

Retouches sur images indexées


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Points : 27
    Points
    27
    Par défaut Retouches sur images indexées
    Bonjour amis internautes,

    J'ai un léger problème avec la SDL 1.2.
    En fait je veux réaliser un fonction toute simple qui modifie la luminosité d'une image passée en paramètre, le problème c'est que l'image que j'envoie est indexée (8 bits), et il faut que le résultat de la fonction soit également une image indexée. En gros il faudrait modifier la palette, moyez ?

    Pour ça il y a la fonction SDL_SetColors, à laquelle on envoie une structure de palette composée d'un int indiquant le nombre de couleurs et d'un tableau qui stocke toutes ses couleurs.
    Voilà le problème : Comment, quand et où stocker les couleurs dans ce tableau ?

    Ci joint le code :
    (merci d'avance pour les réponses)

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    Brightness(SDL_Surface* src, int lum)    {
     
        int x,y;
        int tmp;
        Uint8 r, g, b;
        Uint32 p;
        SDL_Surface* dst = NULL;
        dst = SDL_CreateRGBSurface(SDL_SWSURFACE, src->w, src->h, 8, 0, 0, 0, 0);
        SDL_Color* clrs[src->format->palette->ncolors];
        SDL_LockSurface(src);
        for (y = 0; y < src->h; y++)    {
     
            for (x = 0; x < src->w; x++)  {
                p = getPixel8(src, x, y);
     
                tmp = r + lum;
                if (tmp < 0)
                    r = 0;
                else if (tmp > 255)
                    r = 255;
                else r = tmp;
     
                tmp = g + lum;
                if (tmp < 0)
                    g = 0;
                else if (tmp > 255)
                    g = 255;
                else g = tmp;
     
                tmp = b + lum;
                if (tmp < 0)
                    b = 0;
                else if (tmp > 255)
                    b = 255;
                else b = tmp;
     
                p = SDL_MapRGB(src->format, r, g, b);
                putPixel8(dst, x, y, p);
            }
        }
        SDL_UnlockSurface(src);
        if (dst == NULL)    {
            fprintf(stderr, "Unable to create a destination surface in function : Brightness");
        } else if (dst == src)  {
            fprintf(stderr, "Unable to apply an effect in function : Brightness");
        }
        //dst=src;
        SDL_Palette *pal;
            pal->ncolors = src->format->palette->ncolors;
            pal->colors = clrs;
        SDL_SetColors(dst, pal->colors, 0, pal->ncolors);
        return dst;
    }
     
    putPixel8(SDL_Surface *surface, int x, int y, Uint32 pixel) {
        if (surface->format->BytesPerPixel != 1) {
    	fprintf(stderr, "Fatal error: require 8 bits per pixel!\n");
    	exit (1);
        }
        *(Uint8 *)(surface->pixels + y * surface->pitch + x * 1) = pixel;
    }
     
    getPixel8(SDL_Surface *surface, int x, int y) {
        if (surface->format->BytesPerPixel != 1) {
    	fprintf(stderr, "Fatal error: require 8 bits per pixel!\n");
    	exit (1);
        }
        return *((Uint8 *)surface->pixels + y * surface->pitch + x * 1);
    }

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 41
    Points : 27
    Points
    27
    Par défaut
    Salut

    Es-tu obligé d'avoir ton image d’indexée? Car sinon tu peux très bien modifier l'image pixel par pixel

    Neyort

  3. #3
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    @Anarchy64
    Alors ça fait un moment que j'ai pas fait de SDL niveau pixel , n'hésite pas a utiliser la doc officiel (que j'ai utilisé pour répondre a ta question) , http://wiki.libsdl.org/SDL_PixelFormat .

    Donc pour ton code ça donnerai ça pour mettre en place la palette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    src->format->palette = pal;
    Mais meme si tu met la palette , il faut que ton image soit sur ce format (BitsPerPixe et BytesPerPixelpar exemple).

    Après il y a quand même une (grosse) erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SDL_Palette *pal;
            pal->ncolors = src->format->palette->ncolors;
            pal->colors = clrs;
    SDL_SetColors(dst, pal->colors, 0, pal->ncolors);
    Ce code te fait pas planter ? , tu as de la chance.
    Alors tu fais SDL_Palette *pal mais tu lui donne pas une adresse , et tu modifie ce qu'il y a dans cette adresse : avec pal->ncolors = src->format->palette->ncolors; etc.
    Il faut revisser ces cours avec les pointeurs , mais pour résoudre ton souci il faut faire un malloc.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Bon problème résolu, en fait ça sert à rien de modifier l'index de l'image puisque la position des pixels ne changent pas, j'ai juste pété son contenu avec les setpixels. Il suffisait de modifier ladite palette.

    Désolé pour le malloc oublié j'étais un peu fatigué .

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/02/2014, 11h18
  2. [HTML][débutante] Map ou Onclick sur image ? Différent ?
    Par khany dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 08/12/2004, 14h05
  3. Questions sur les indexations
    Par freud dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2004, 11h38
  4. [allegro]passage de pointeur sur image
    Par Gonath dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 13/12/2003, 18h47
  5. zoom sur image de formulaire
    Par bourvil dans le forum VBA Access
    Réponses: 2
    Dernier message: 01/10/2003, 09h25

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