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

  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

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut Petit problème
    Bonjour,

    Je viens de tester les deux fonctions que vous proposez, et elle ne fonctionnent
    pas. Aucune image n'est recopiée dans le bufferBmp qui garde sa valeur d'initialisation (tout comme bufferTmp )...
    J'ai du faire un transtipage dans la fonction FreeImage_AcquireMemory pour remédier à une erreur de compilation comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FreeImage_AcquireMemory(hmem2, &bufferTemp, (DWORD*)bufsizeBmp);
    j'utilise Visual Studio 2003, et j'ai une fonction perso qui fait ce travail, j'aurais donc aimer savoir qu'elles sont les performances de votre fonction (pour des images 320*240 par exemple )

    D'avance merci pour toute solution ou réponse.

    Cordialement,
    Sébastien Linck.

  9. #9
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Bonjour et bien venue sur le forum.
    Citation Envoyé par SebLinck Voir le message
    Bonjour,

    Je viens de tester les deux fonctions que vous proposez, et elle ne fonctionnent
    pas. Aucune image n'est recopiée dans le bufferBmp qui garde sa valeur d'initialisation (tout comme bufferTmp )...
    Comment cela??

    j'utilise Visual Studio 2003, et j'ai une fonction perso qui fait ce travail, j'aurais donc aimer savoir qu'elles sont les performances de votre fonction (pour des images 320*240 par exemple )
    Que veut tu dire par performance??

    TU devrait ouvrir un autre thread

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    J'ai tester les fonctions en les incluant dans mon code tout simplement,
    je dit les deux fonctions puisque la première version a été modifiée.

    ce que je veux dire par performance, c'est combien de ticks d'horloge sont nécessaires à la conversion d'un buffer jpeg à un buffer bmp ( ou miliseconde , ce qui dépend des machines ).
    ma fonction nécessite 640 000 ticks soit 32 ms (CPU 2Ghz).

    voilà si l'utilisation de FreeImage s'avère est plus lente, je ne cherche pas à l'intégrer.

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par SebLinck Voir le message
    J'ai tester les fonctions en les incluant dans mon code tout simplement,
    je dit les deux fonctions puisque la première version a été modifiée.
    quel fonction? Ca marche ou ca marche pas?

    ce que je veux dire par performance, c'est combien de ticks d'horloge sont nécessaires à la conversion d'un buffer jpeg à un buffer bmp ( ou miliseconde , ce qui dépend des machines ).
    ma fonction nécessite 640 000 ticks soit 32 ms (CPU 2Ghz).
    Ça me parait beaucoup.

    Tu vaut faire quoi au juste??

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    Comme je le disait : les bufferBmp et BufferTmp garde leurs valeurs d'origine,
    donc ça ne marche pas. Puisque je devrais avoir mon image au format bmp dans mon bufferBmp .
    les fonctions sont:
    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
    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);
    }
    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
    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);
    }
    Et oui effectivement, c'est un peu beaucoup en temps de calcul, c'est pour ça que je cherche d'autre méthode de conversion.
    ce que je veux faire:
    convertir un buffer Jpeg en bufferBmp le plus rapidement possible...

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    1- Nomalement, c'est a toi d'allouer mem_buffer et de donner la taille donner un taille avec size_in_bytes.

    Citation Envoyé par SebLinck Voir le message
    convertir un buffer Jpeg en bufferBmp le plus rapidement possible...
    J'avais compris, mais après, tu va faire quoi??

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 5
    Par défaut
    je récupère des images Jpeg de caméras IP.
    Je converti en Bmp.
    Je noircie les zones privées.
    j'applique un traitement d'image. (ouverture dilatation érosion ...)
    J'affiche le résultat.

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Citation Envoyé par SebLinck Voir le message
    je récupère des images Jpeg de caméras IP.
    Je converti en Bmp.
    Je noircie les zones privées.
    j'applique un traitement d'image. (ouverture dilatation érosion ...)
    J'affiche le résultat.
    Alors pourquoi repasser en BMP????
    tu perd du temps pour rien.

  16. #16
    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 Mongaulois Voir le message
    Alors pourquoi repasser en BMP????
    tu perd du temps pour rien.
    Bonjour a tous,

    Dans mon cas, je repasse mes images en jpg car derrière j'utilise la bibliothèque de traitement d'image openCV. Cette biblio applique des traitements pixel par pixel suivant les 3 canaux RGB. Hors en jpg, l'image est compressé et donc non utilisable sans conversion.

    Enfin mon code est utilisable qu'en C. Pour le passer en C++, j'ai du faire tout comme toi un transtypage et j'ai réussi a le faire fonctionner comme ça. Je ne sais pas le temps que prends cette fonction, mais tout ce que je sais c'est que forcement le temps est long. Il y a de multiples traitements et ne les connaissant pas, j'ai préfère utilisé FreeImage.

    Meme si ce n'est peut être pas optimisé, en tout cas, ça fonctionne
    mais si tu trouves plus simple, alors je suis preneur !

    Bonne journée

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    Par défaut
    Pour du c++, il faut utiliser freeimage++ (binding de freeimage en C++).

    Après, pour le jpeg, freeimage utilise libjpeg. Donc les performances dépende de ceci à mon avis. Comment test tu les performances????e

+ 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