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

C Discussion :

Afficher une image sauvegardée par Gimp en .c


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut Afficher une image sauvegardée par Gimp en .c
    Bonjour à tous,

    J'essaye en vain, depuis un certain temps, d'ouvrir une image qui a été malheureusement enregister sous la forme d'un fichier.c. Je n'ai aucune autre source a ma disposition. L'image étant relativement conséquente voici le debut du fichier contenant l'image:
    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
     
    /* image.c */
    static const struct {
      unsigned int 	 width;
      unsigned int 	 height;
      unsigned int 	 bytes_per_pixel; /* 3:RGB, 4:RGBA */ 
      unsigned char	 pixel_data[800 * 600 * 3 + 1];
    } bob_image = {
      800, 600, 3,
      "\251\247w{yJ\177|P|{P|zRz|Rz|Pz|P~{I~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH"
      "~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH"
      "~zH~zH~zH~zH~zH~zH~zHzvDzvDzvDzvD~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH"
      "~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH~zH"
      "~zH~zH~zH~zH~zH~zH~zH~{H~{H~{H~{H~zH~zH~zH~zH}zG|xFzvDxuB{xE{xE{xE{xEzwD"
      "zwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwDzwD{xE"
      "{xE{xE{xEzwDzwDzwDzwDzwDzwDzwDzwD{xE{xE{xE{xE{xE{xE{xE{xEzwDzwDzwDzwDzwD"
    ............
    Ma question est donc : est-il possible de lire "facilement cette image" ou bien quelqu'un est-il capable de l'ouvrir pour moi (et ainsi de me la renvoyer) ?

    Note : Vous vous demandez peut etre pourquoi j'essaye de lire une image volontairement stocker dans un .c ? Alors, pour simplifier disons que c'est l'oeuvre d'un petit comique qui s'amuse a faire un petit jeu de piste (et donc je suppose qu'un indice est contenu dans cette fameuse image).

    Voila, merci a tous !!!

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    C'est plutôt simple à traduire en image, essaye d'utiliser la SDL avec les fonctions permettant de modifier la couleur de chaque pixel, ou alors envoie-moi ton fichier complet...

    D'ailleurs je comprend spas l'intérêt de mettre +1 dans la taille du tableau. Soit c'est pour la couche Alpha et là, ton ami doit réviser ses maths, soit c'est pour le caractère '\0' final d'une chaîne de caractère, mais là encore ça sert à rien puisque c'est un tableau d'octets et non pas une chaîne de caractères C, le '\0' est donc inutile.

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    432
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 432
    Par défaut
    Ca doit pouvoir se traduire en .pgm.
    Passe moi le fichier complet je voudrai bien essayer, ça me fera un petit exercice...
    Si j'y arrive à rendre l'image visible je t'expliquerai comment j'ai fait.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut Voilà
    Si le but n'est pas d'avoir un programme propre mais juste d'extraire l'image, avec SDL c'est très simple. Vu que c'est une image 800*600 avec 1 octet par couleur.

    J'ai pris le .c sur:
    http://dl.free.fr/lQ97NBMAL/vendredi14decembre2007.c

    Tout d'abord on transforme la structure en tableau simple:

    Avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /* image.c */
    static const struct {
      unsigned int 	 width;
      unsigned int 	 height;
      unsigned int 	 bytes_per_pixel; /* 3:RGB, 4:RGBA */ 
      unsigned char	 pixel_data[800 * 600 * 3 + 1];
    } bob_image = {
      800, 600, 3,...
    Après:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char bob_image[] = {
      "\251\247...
    On met le tout dans img.h. Il nous reste plus qu'à coder vite fait un code SDL:

    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
    71
    72
    73
     
    #include "img.h"
    #include <stdio.h>
    #include <unistd.h>
    #include "SDL.h"
     
    void putPixel(SDL_Surface * surface, Uint16 x, Uint16 y, Uint32 color)
    {
        /* Nombre de bits par pixels de la surface d'écran */
        Uint8 bpp = surface->format->BytesPerPixel;
        /* Pointeur vers le pixel à remplacer (pitch correspond à la taille
     *        d'une ligne d'écran, c'est à dire (longueur * bitsParPixel)
     *               pour la plupart des cas) */
        Uint8 * p = ((Uint8 *)surface->pixels) + y * surface->pitch + x * bpp;
         switch(bpp)
        {
              case 1:
                    *p = (Uint8) color;
                    break;
            case 2:
                *(Uint16 *)p = (Uint16) color;
                break;
            case 3:
                if (SDL_BYTEORDER == SDL_BIG_ENDIAN)
                {
                    *(Uint16 *)p = ((color >> 8) & 0xff00) | ((color >> 8) & 0xff);
                    *(p + 2) = color & 0xff;
                }
                else
                {
                    *(Uint16 *)p = color & 0xffff;
                    *(p + 2) = ((color >> 16) & 0xff) ;
                }
                break;
            case 4:
                *(Uint32 *)p = color;
                break;
        }
    }
     
    int main(int argc, char * argv[])
    {
        unsigned long offset=0;
        SDL_Surface * screen;
        SDL_Surface * image, * tmp;
        SDL_Rect blitrect = {0, 0, 0, 0};
        int i, j;
         if (SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            printf("Erreur lors de l'initialisation de SDL: %s\n", SDL_GetError());
            return 1;
        }
     
        #define SDL_VIDEO_FLAGS (SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT)
     
        screen = SDL_SetVideoMode(800, 600, 24,
                                  SDL_VIDEO_FLAGS);
     
        printf("Mode vidéo: dx%d\n", screen->w, screen->h,
               screen->format->BitsPerPixel);
       SDL_LockSurface(screen);
     
    //   SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format, 0x00, 0x00, 0xff));
     
       for (j = 0; j < screen->h; j++)
            for (i = 0; i < screen->w; i++)
                putPixel(screen, i, j, SDL_MapRGB(screen->format, bob_image[offset++], bob_image[offset++], bob_image[offset++]));
     
     
        SDL_UnlockSurface(screen);
        SDL_Flip(screen);
        sleep(5);
    }
    On compile le tout avec gcc (sous GNU/Linux):

    gcc `sdl-config --cflags --libs` cool.c -o a.out

    il ne faut pas oublier d'installer la libsdl

    et on obtient ça:



    Voilà.

  5. #5
    Membre chevronné Avatar de icer
    Inscrit en
    Janvier 2006
    Messages
    332
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 332
    Par défaut
    Il n'y a pas un probème avec les couleurs là ?
    Ou peut-être ça fait partie du jeux de piste...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut
    Merci bcp à tous pour tout !!!
    J'espere qu'on va vite retrouver notre Bob !!!
    Encore merci
    A+

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Oui il y a un problème de couleurs
    Et désolé pierrex_, le problème était déjà résolu avec les bonnes couleurs.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 3
    Par défaut Couleurs
    Comment ça un problème avec les couleurs? C'est bien comme ça non?

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Tricheur

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

Discussions similaires

  1. Afficher une image par dessus une scene 3D
    Par drcd dans le forum OpenGL
    Réponses: 9
    Dernier message: 02/04/2007, 19h59
  2. [GD] comment afficher une image genérée par GD
    Par lochou dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 25/10/2006, 22h03
  3. Réponses: 5
    Dernier message: 13/04/2006, 22h54
  4. [MySQL] Comment afficher une image par défaut ?
    Par clicman dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 12/10/2005, 08h46
  5. Afficher une image sans passer par les textures
    Par Black_Daimond dans le forum DirectX
    Réponses: 3
    Dernier message: 09/05/2003, 19h13

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