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

Bibliothèques Discussion :

erreur memory stream avec FREEIMAGE


Sujet :

Bibliothèques

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 54
    Points
    54
    Par défaut erreur memory stream avec FREEIMAGE
    bonjour,
    je cherche a obtenir une image et l'écrire dans un fichier,pour cela, j'ai recuperer via un socket (fonction receiv), le hnem provenant d'un hnem=savetomemory(...), et jai envoyer hnem ssur le reseau, je le recupere a l'autre bout, masi quand je lance ce code, sa plante a tellmemory, je pênse que c'est le hnem ki ne lui plait pas, avec gdb il me dit direct erreur dans tell memory.

    voir plutot le code :
    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
     
     
    #include <string.h>
    #include <signal.h>
    #include <stdio.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <errno.h>
    #include "libudp.h"
     
    #include "FreeImage.h"
     
     
     
    main()
    {
    FILE*fp;
     
    BYTE*buf=NULL;
    DWORD size;
    int calc=0;
    FIMEMORY *hmem=NULL;
     
     
     
    hmem=FreeImage_OpenMemory(0,0);
     
    hmem=(FIMEMORY*)receiv(&calc); // je le cast car receiv renvoie un char*
    //memcpy(&image,dest,calc);
     
    // at this point, hmem contains the entire data in memory stored in fif format.
    // the amount of space used by the memory is equal to file_size
    long file_size = FreeImage_TellMemory(hmem);
    printf("File size : %ld\n", file_size);
    // its easy to load an image from memory as well
    // seek to the start of the memory stream
    FreeImage_SeekMemory(hmem, 0L, SEEK_SET);
    // get the file type
    FREE_IMAGE_FORMAT mem_fif = FreeImage_GetFileTypeFromMemory(hmem, 0);
    // load an image from the memory handle
    FIBITMAP *check = FreeImage_LoadFromMemory(mem_fif, hmem, 0);
    // save as a regular file
    FreeImage_Save(FIF_JPEG, check, "dump.jpeg", JPEG_DEFAULT);
    // make sure to close the stream since FreeImage_SaveToMemory
    // will cause internal memory allocations and this is the only
    // way to free this allocated memory
    FreeImage_CloseMemory(hmem);
    FreeImage_Unload(check);
     
    }
    ou est mon erreur ?? je ne voit vraiment pas.
    Merci.

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 54
    Points
    54
    Par défaut
    de plus, je compare le FIREMEMORY avant et apres l'envoie, avec un afficheur hexadecimal, et les fichier fond exactement la meme taille, mais n'ont pas exactement le meme contenu...par exemple dans le fichier recu, l'adresse IP s'y est gréfer, alors que dans celui d'avant l'envoie, pas du tout, ce qui est logik....je ne comprend pas pourquoi le HNEM recu et envoyer ne sont pas strictement identique, masi ont exactement la meme taille.

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hmem=(FIMEMORY*)receiv(&calc); // je le cast car receiv renvoie un char*
    Ca j'y croit pas trop....
    Normalement tu récupère le buffer de receiv et tu le copie dans un FIMEMORY*. Tu ne sait pas comment est initialisé FIMEMORY en interne. Par un cast, ca m'étonnerai.
    Bien faut que ce soit reciproque. Tu envoie le contenue de FIMEMORY et pas FIMEMORY

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Dans la doc il mette ca
    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
     
    void testLoadMemIO(const char *lpszPathName) {
      struct stat buf;
      int result;
      // get data associated with lpszPathName
      result = stat(lpszPathName, &buf);
      if(result == 0) {
        // allocate a memory buffer and load temporary data
        BYTE *mem_buffer = (BYTE*)malloc(buf.st_size * sizeof(BYTE));
        if(mem_buffer) {
          FILE *stream = fopen(lpszPathName, "rb");
          if(stream) {
            fread(mem_buffer, sizeof(BYTE), buf.st_size, stream);
            fclose(stream);
            // attach the binary data to a memory stream
            FIMEMORY *hmem = FreeImage_OpenMemory(mem_buffer, buf.st_size);
            // get the file type
            FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(hmem, 0);
            // load an image from the memory stream
            FIBITMAP *check = FreeImage_LoadFromMemory(fif, hmem, 0);
            // save as a regular file
            FreeImage_Save(FIF_PNG, check, "blob.png", PNG_DEFAULT);
            FreeImage_Unload(check);
            // always close the memory stream
            FreeImage_CloseMemory(hmem);
          }
        }
        // user is responsible for freeing the data
        free(mem_buffer);
      }
    }


    et

    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
    void testAcquireMemIO(const char *lpszPathName) {
      FIMEMORY *hmem = NULL;
      // load a regular file
      FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(lpszPathName);
      FIBITMAP *dib = FreeImage_Load(fif, lpszPathName, 0);
      // open and allocate a memory stream
      hmem = FreeImage_OpenMemory();
      // save the image to a memory stream
      FreeImage_SaveToMemory(FIF_PNG, dib, hmem, PNG_DEFAULT);
      FreeImage_Unload(dib);
      // get the buffer from the memory stream
      BYTE *mem_buffer = NULL;
      DWORD size_in_bytes = 0;
      FreeImage_AcquireMemory(hmem, &mem_buffer, &size_in_bytes);
      // save the buffer to a file stream
      FILE *stream = fopen("buffer.png", "wb");
      if(stream) {
        fwrite(mem_buffer, sizeof(BYTE), size_in_bytes, stream);
        fclose(stream);
      }
      // close and free the memory stream
      FreeImage_CloseMemory(hmem);
    }

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par aziatedu13 Voir le message
    de plus, je compare le FIREMEMORY avant et apres l'envoie, avec un afficheur hexadecimal, et les fichier fond exactement la meme taille, mais n'ont pas exactement le meme contenu...par exemple dans le fichier recu, l'adresse IP s'y est gréfer, alors que dans celui d'avant l'envoie, pas du tout, ce qui est logik....je ne comprend pas pourquoi le HNEM recu et envoyer ne sont pas strictement identique, masi ont exactement la meme taille.
    La c'est un autre problème... Mais la on pourra pas t'aider car on ne sait pas comment tu utilise les soket.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 54
    Points
    54
    Par défaut
    bonjour,
    d"soler du retard pour une réponse, je n'était plus disponible.
    je revien donc pour une nouvelle question.
    envoyé le hmem était une mauvaise idée, j'ai donc pensé envoyer le CHECK,
    cela a marché et a partir de CHECK, je refait une image JPEG avec les fonction a partir de CHECK,
    masi il y a un soucis, comment pouvons nous connaitre la taille de check??
    il n'y a aucune fonction qui renvoie la taille de check.....pour malloqué le check vide coté reception,cela est indispensable de connaitre sa taille...

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 54
    Points
    54
    Par défaut TAILLE FIBITMAP*check
    bonjour,
    d"soler du retard pour une réponse, je n'était plus disponible.
    je revien donc pour une nouvelle question.
    envoyé le hmem était une mauvaise idée, j'ai donc pensé envoyer le CHECK,
    cela a marché et a partir de CHECK, je refait une image JPEG avec les fonction a partir de CHECK,
    masi il y a un soucis, comment pouvons nous connaitre la taille de check??
    il n'y a aucune fonction qui renvoie la taille de check.....pour malloqué le check vide coté reception,cela est indispensable de connaitre sa taille...

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    Points : 54
    Points
    54
    Par défaut
    OK, avec la fonction acquiert memory, tout cela devient simple.

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

Discussions similaires

  1. problème avec un memory stream
    Par aurel_le_ouf dans le forum C#
    Réponses: 1
    Dernier message: 09/04/2008, 17h35
  2. Erreur de cast avec System.IO.Stream
    Par Amokrane dans le forum Framework .NET
    Réponses: 11
    Dernier message: 25/03/2008, 20h15
  3. Erreur sur IIS avec des cripts ASP
    Par Alin dans le forum ASP
    Réponses: 7
    Dernier message: 22/06/2004, 14h15
  4. erreur tcp/ip avec jdbc
    Par champion dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 03/04/2004, 14h32
  5. Erreur de sgmentation avec malloc
    Par simonm dans le forum C
    Réponses: 5
    Dernier message: 27/02/2003, 08h29

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