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 :

FreeImage buffer Jpeg -> buffer Bmp


Sujet :

Bibliothèques

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut FreeImage buffer Jpeg -> buffer Bmp
    Bonjour,

    Je cherche à créer un programme qui puisse faire du quasi-temps réels. Je veux faire de la conversion Jpeg->Bmp mais que ca se fasse dans la RAM et pas en écriture sur le disque.

    Je veux prendre en mémoire un buffer qui contient une image jpg, et resauvegarder dans un nouveau buffer cette image en un bmp
    J'ai donc créer une fonction qui effectue cette tache et qui en plus, m'ecris le fichier final pour etre certain que j'ai effectué le bon travail



    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
     
    void FI_Test(const char *bufferJpg, const int bufsizeJpg, char *bufferBmp, int *bufsizeBmp)
    {
    	FIMEMORY *hmem = NULL;
    	FREE_IMAGE_FORMAT fif;
    	FIBITMAP *check;
     
    	BYTE *mem_buffer = NULL;
    	DWORD size_in_bytes = 0;
    	FILE *stream = NULL;
     
    	hmem = FreeImage_OpenMemory(bufferJpg, bufsizeJpg);
    	fif = FreeImage_GetFileTypeFromMemory(hmem, 0);	// get the file type
    	check = FreeImage_LoadFromMemory(fif, hmem, 0);	// load an image from the memory stream
     
    	FreeImage_Save(FIF_BMP, check, "blob.bmp", BMP_DEFAULT);
    // le fichier blob.bmp est correctement constitué sur le disque
     
    	// save the image to a memory stream
    	FreeImage_SaveToMemory(FIF_BMP, check, hmem, BMP_DEFAULT);
     
    	FreeImage_AcquireMemory(hmem, &mem_buffer, &size_in_bytes);
    	// save the buffer to a file stream
    	stream = fopen("test.bmp", "wb");
    	if(stream) {
    		fwrite(mem_buffer, sizeof(BYTE), size_in_bytes, stream);
    		fclose(stream);
    	}
     
    	// close and free the memory stream
    	FreeImage_CloseMemory(hmem);
    	FreeImage_Unload(check);
    }
    A la fin de cette fonction, le problème réside dans test.bmp ou IrfanView me dit que ce n'est pas un bmp mais un jpg.
    grâce a la fonction FreeImage_SaveToMemory, je pensais que la conversion Jpg->Bmp serait faite

    Pouvez vous me dire ou se situe mes erreurs ? Merci d'avance

    Topeur60

  2. #2
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut Solution trouvé
    Mon erreur provenait apparement d'une non réouverture de mémoire.
    Pour enregistrer mon bmp, j'ai du ouvrir un nouvel espace mémoire avec un buffer temporaire qui a été en fait un hmem2

    supra géniale
    Bonne journée

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut Demande solution
    Salut Topeur,

    J'aimerais faire la même chose que toi, ainsi peux-tu me donner ta solution finale.

    De plus, pourrais-tu stp expliquer en détail ta fonction : les paramètres en entrée , et en sortie ...

    Merci.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut Informations lib FreeImage
    Autre question : Est-ce que la lib FreeImage peut être utilisée avec le compilateur mingw ?

    Sinon je sais qu'il existe une autre lib portable : CImg. Peut-on faire la même chose avec cette lib ?

  5. #5
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut
    Bonjour,

    Voici le proto de ma fonction finale

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void FI_JpgtoBmp(unsigned char *bufferJpg, const int bufsizeJpg, unsigned char *bufferBmp, int *bufsizeBmp);
    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
     
    void FI_JpgtoBmp(unsigned char *bufferJpg, const int bufsizeJpg, unsigned char *bufferBmp, int *bufsizeBmp)
    {	
    	FIMEMORY *hmem = NULL,*hmem2 = NULL;
    	FREE_IMAGE_FORMAT fif;
    	FIBITMAP *check;
    	BYTE *mem_buffer = NULL;
    	DWORD size_in_bytes = 0;
    	unsigned char *bufferTemp=NULL;
     
     
    	hmem = FreeImage_OpenMemory(bufferJpg, bufsizeJpg);
    	fif = FreeImage_GetFileTypeFromMemory(hmem, 0);	// get the file type
    	check = FreeImage_LoadFromMemory(fif, hmem, 0);	// load an image from the memory stream
    	FreeImage_CloseMemory(hmem);
     
    	// save the image to a memory stream
    	hmem2 = FreeImage_OpenMemory(mem_buffer, size_in_bytes);
    	FreeImage_SaveToMemory(FIF_BMP, check, hmem2, BMP_DEFAULT);
    	FreeImage_AcquireMemory(hmem2, &bufferTemp, bufsizeBmp);
    	memcpy(bufferBmp,bufferTemp,*bufsizeBmp);
     
    	// close and free the memory stream
    	FreeImage_CloseMemory(hmem2);
    	FreeImage_Unload(check);
    }
    Pour ce qui est des paramètres d'entrées
    Il faut passer un tableau qui contient une image jpeg ainsi que sa taille

    En sortie, tu récupèrera un tableau(que tu aura declaré avant avec une taille adequate) contenant la meme image en BMP ainsi que la taille de l'image





    Pour ce qui est des autres informations que tu a demandé, je n'en sais rien
    Moi je tourne avec Visual C++ 2008 version express et je code uniquement en C. desolé

    Bon courage

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Par défaut Merci
    Merci beaucoup.

    J'ai testé sur Linux et en effet ça marche. Par contre, j'ai un peu modifier ton 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
     
    void FI_JpgtoBmp(unsigned char *bufferJpg, const int bufsizeJpg, unsigned char *bufferBmp, int *bufsizeBmp)
    {	
    	FIMEMORY *hmem = NULL,*hmem2 = NULL;
    	FREE_IMAGE_FORMAT fif;
    	FIBITMAP *check;
    	BYTE *mem_buffer = NULL;
    	DWORD size_in_bytes = 0;
     
    	hmem = FreeImage_OpenMemory(bufferJpg, bufsizeJpg);
    	fif = FreeImage_GetFileTypeFromMemory(hmem, 0);	// get the file type
    	check = FreeImage_LoadFromMemory(fif, hmem, 0);	// load an image from the memory stream
    	FreeImage_CloseMemory(hmem);
     
    	// save the image to a memory stream
    	hmem2 = FreeImage_OpenMemory();
    	FreeImage_SaveToMemory(FIF_BMP, check, hmem2, BMP_DEFAULT);
    	FreeImage_AcquireMemory(hmem2, &bufferBmp, &bufsizeBmp)
     
    	// close and free the memory stream
    	FreeImage_CloseMemory(hmem2);
    	FreeImage_Unload(check);
    }
    Ainsi dans ce cas, il n'est pas nécessaire de connaitre la taille de l'image finale BMP. L'allocation est faite en internet dans la fonction FreeImage_AcquireMemory ; il me semble. (A verifier)

    Ensuite, il me reste à récupérer la lib pour mingw (Windows) et tester.

    Merci encore

  7. #7
    Membre confirmé Avatar de Topeur
    Profil pro
    Inscrit en
    Février 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 91
    Par défaut
    Citation Envoyé par sagopa Voir le message
    Merci beaucoup.

    Ainsi dans ce cas, il n'est pas nécessaire de connaitre la taille de l'image finale BMP. L'allocation est faite en internet dans la fonction FreeImage_AcquireMemory ; il me semble. (A verifier)

    Merci encore
    Pas de quoi, je me suis battu pendant un sacrée moment pour réussir ça ^^
    surtout que j'avais un peu de mal avec le C donc c'est pour ca que la fonction n'est pas super bien codé, j'ai pas le courage de le refaire ^^

    Sinon, tu a sans doute raison au sujet de la taille de l'image finale, vu que je la passe en tant que pointeur, c'est donc qu'elle est modifié dans la fonction et j'avais besoin de la remonté car en C, la taille du tableau est vitale

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

Discussions similaires

  1. [OpenGL 4.x] Vertex buffer et Index buffer Problème de rendu
    Par Ninored dans le forum OpenGL
    Réponses: 3
    Dernier message: 30/08/2014, 01h46
  2. Image jpeg : buffer -> file
    Par sagopa dans le forum C++
    Réponses: 21
    Dernier message: 06/06/2008, 18h44
  3. [VC++ 2003] copie d'un buffer vers un buffer plus petit
    Par Rafoo dans le forum Visual C++
    Réponses: 3
    Dernier message: 21/09/2006, 15h01
  4. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38
  5. BMP & Buffer
    Par jackjack dans le forum DirectX
    Réponses: 3
    Dernier message: 03/06/2003, 16h31

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