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 :

compression 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 compression avec freeimage
    bonjour,

    j'essai de compresser une image en JPEG avec la lib freeimage,
    un probleme se pose dans mon projet : je n'ai pas de fichier image , mais directement un buffer RGB 24.les fonction de la lib freeimage ouvre toute d fichier image avant de les traiter.je ne trouve pas le moyne d'adapter cela , pouvez vous m'indiquer une solution , une méthode ? une voix de recherche ?
    Merci.

    Code c++ : 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
     
    void acquisition()
    {
     
    FILE* file;
    int width,height,depth,lenght;
    char fic[15];
    unsigned char * buffer;
    struct stat buf;
    FIMEMORY *hmem = NULL;
    BYTE * mem_buffer=NULL;
    DWORD original_size=(width*height*depth/3)*sizeof(BYTE);
    DWORD compressed_size;
     
    compressed_size=(DWORD)((double)original_size+ (0.1* (double)original_size) +12);
     
    	buffer=GrabVideo(&video,&width,&height,&depth);
     
    	if(buffer!=NULL)
    	{ 
     
    	// open and allocate a memory stream
    hmem = FreeImage_OpenMemory(0,0);
     
    // save the image to a memory stream
    FreeImage_SaveToMemory(FIF_JPEG, (FIBITMAP *)buffer, hmem, JPEG_DEFAULT);
    FreeImage_Unload((FIBITMAP *)buffer);
     
    // 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.jpeg", "wb");
    if(stream) {
    fwrite(mem_buffer, sizeof(BYTE), size_in_bytes, stream);
    fclose(stream);
    }
    // close and free the memory stream
    FreeImage_CloseMemory(hmem);
    	envoiepacket((int)compressed_size,(char*)buffer);
     
    	}
     
    	else 
    		printf("erreur grabbing\n");
     
    CloseVideo(&video);
    exit(0);	
     
    }la foncion grab video renvoie une chaine unsigne char *

  2. #2
    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
    Bonjour,
    pour cela, il faut que tu créé un FIBITMAP avec FreeImage_Allocate.
    et regarde la partie :
    Pixel access functions
    de la doc
    http://freeimage.sourceforge.net/documentation.html

  3. #3
    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
    Merci,

    j'ai a nouveau un problème de "type"de variable.
    dans la fonction setpixel,le dernier argument est de type RGBQUAD, dans freeimage.h, je trouve cette structure,qui est composer de R,G et b mais de type BYTE.
    comment passer de "unsigned char" a BYTE sans risk de perte d'information?????
    Merci de votre attention.

  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
    Citation Envoyé par aziatedu13 Voir le message
    Merci,

    j'ai a nouveau un problème de "type"de variable.
    dans la fonction setpixel,le dernier argument est de type RGBQUAD, dans freeimage.h, je trouve cette structure,qui est composer de R,G et b mais de type BYTE.
    comment passer de "unsigned char" a BYTE sans risk de perte d'information?????
    Merci de votre attention.
    Ben normalement BYTE est un typedef de unsigned char ou de char je sais plus
    Dans la doc il y as un exemple de remplissage de l'image en utilisant scanline.
    Si tu veut met ton code je pourrai te dire ou ca ne va pas. Sinon si tu prefere C++ il y as freimage+ qui est plus simple a utiliser a mon avis.

  5. #5
    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
    voila mon 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "Libvideo.h"
    #include "Libvideonext.h"
    #include <signal.h>
    #include <X11/Xlib.h>
    #include "Libvideo.c"
    #include <X11/extensions/xf86dga.h>
    #include <X11/Xutil.h>
    #include"RGBtoBMP+envoie.c"
    #include <time.h>
     
      #include <sys/types.h>
           #include <sys/stat.h>
        #include "FreeImage.h"
     
    void acquisition()
    {
     
    FILE* file;
    int width,height,depth,lenght,i=0,j=0;
    char fic[15];
    unsigned char * buffer;
    struct stat buf;
    FIMEMORY *hmem = NULL;
    BYTE * mem_buffer=NULL;
    BYTE * test;
    RGBQUAD *pix;
    int k;
    long file_size;
     
    	buffer=GrabVideo(&video,&width,&height,&depth);
    	FIBITMAP *dib = FreeImage_AllocateT(FIT_BITMAP,width,height,3,0,0,0);
    	//je créer le conteneur de l'image de type image classique, puisque mon buffer est en rgb24
     
    	if(buffer!=NULL)
    	{ 
     
    	while(buffer!=NULL)
    	{
    			//je rempli le conteneur dib
    			for(k=0;k<height;k++)
    			{
    				pix[j].rgbBlue=buffer[i];
    				pix[j].rgbGreen=buffer[i+1];
    				pix[j].rgbRed=buffer[i+2];
    				FreeImage_SetPixelColor(dib, i, k,pix);
    				i+=3;
    				j=j+1;
    			}
    	}
    //la g copier le bout de code ds la doc freeimaeg pour sauver en un type donné, donc la JPEG	
     
     
    	// open and allocate a memory stream
    hmem = FreeImage_OpenMemory(0,0);
     
    FreeImage_SaveToMemory(FIF_JPEG,dib, hmem, 0);
    // 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
    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);
    FreeImage_Unload(dib);
    envoiepacket(file_size,(char*)buffer);
     
    }
    // close and free the memory stream
     
     
    	else 
    		printf("erreur grabbing\n");
     
     
    CloseVideo(&video);
    exit(0);	
     
    }

    ce bout de code ne marche pas, erruer segmentation, je ne voit pas trop...
    merci de vos commentaires.

  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
    correction a vers les derneire ligne, pour la fonction envoie, je veut envoyer le buffer compresser, et pas ecrire le fichier compresser.
    donc ce n'est pas envoie(size,(char*)buffer),mais envoie(size,hnem).
    non ???

  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
    je corrige ma fonction de remplissage de dib :

    k était la colonne, j le pixel, et "i" l'emplacement de la composante R , G ou B présente ds le buffer "buffer".

    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
     
    while(buffer!=NULL)
    	{
     
    				do
    				{
    					pix[j].rgbBlue=buffer[i];
    					pix[j].rgbGreen=buffer[i+1];
    					pix[j].rgbRed=buffer[i+2];
    					FreeImage_SetPixelColor(dib, i, k,pix);
    					i+=3;
    					j=j+1;
    					k=i/height;
     
    				}while(k<height+1);
    	}

  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 correction coordonée de setpixel
    j'ai remarquer que la coordonnée x de setpixel , n'était pas du tout i,

    je l'ai donc modifié :
    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
     
    while(buffer!=NULL)
    	{
     
    				do
    				{
    					pix.rgbBlue=buffer[i];
    					pix.rgbGreen=buffer[i+1];
    					pix.rgbRed=buffer[i+2];
    					FreeImage_SetPixelColor(dib, j, k,&pix);
    					i+=3;
    					j=j+1;
    					if(i>=width)
    					j=0;
     
    					k=i/height;
     
    				}while(k<height+1);
    	}

  9. #9
    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.
    Déja pourquoi???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "Libvideo.c"
    #include"RGBtoBMP+envoie.c"
    sinon, je voit pas ce que c'est sensé faire ici...
    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
     
    if(buffer!=NULL)
    	{ 
     
    	while(buffer!=NULL)
    	{
    			//je rempli le conteneur dib
    			for(k=0;k<height;k++)
    			{
    				pix[j].rgbBlue=buffer[i];
    				pix[j].rgbGreen=buffer[i+1];
    				pix[j].rgbRed=buffer[i+2];
    				FreeImage_SetPixelColor(dib, i, k,pix);
    				i+=3;
    				j=j+1;
    			}
    	}
    Ton buffer est en RGB ou BGR??

    essai de t'inspiré de ce 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
     
    FIBITMAP *dib = FreeImage_Allocate(512, 512, 32, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
    // Calculate the number of bytes per pixel (3 for 24-bit or 4 for 32-bit)
    int bytespp = FreeImage_GetLine(dib) / FreeImage_GetWidth(dib);
    for(unsigned y = 0; y < FreeImage_GetHeight(dib); y++) {
    BYTE *bits = FreeImage_GetScanLine(dib, y);
    for(unsigned x = 0; x < FreeImage_GetWidth(dib); x++) {
    // Set pixel color to green with a transparency of 128
    bits[FI_RGBA_RED] = 0;
    bits[FI_RGBA_GREEN] = 255;
    bits[FI_RGBA_BLUE] = 0;
    bits[FI_RGBA_ALPHA] = 128;
    // jump to next pixel
    bits += bytespp;
    }

  10. #10
    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
    alors, je vais essayer d'être plus préci :

    mon buffer "buffer " est en RGB24.
    il ne contien que des valeur des composante R,G et B. donc aucun format d'image ne lui est attibué.
    je veut compresser ce buffer en JPEG, et obtenir le buffer contenant le JPEG.
    Donc voici 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
     
    void acquisition()
    {
     
    FILE* file,*file2;
    int width,height,depth,lenght,i=0,j=0;
    char fic[15];
    unsigned char * buffer;
    struct stat buf;
    FIMEMORY *hmem = NULL,*hmem2=NULL;
    BYTE * mem_buffer=NULL;
    BYTE * test;
    RGBQUAD pix;
    int k,p,file_sizecompressed;
    long file_size,file_size2;
    unsigned y,x;
    unsigned char* popo;
    popo=malloc(1024*1024);	
     
     
     
    	buffer=GrabVideo(&video,&width,&height,&depth);
     
    		FIBITMAP *dib = FreeImage_Allocate(width,height , depth, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
     
    // Calculate the number of bytes per pixel (3 for 24-bit or 4 for 32-bit)
    int bytespp = FreeImage_GetLine(dib) / FreeImage_GetWidth(dib);
     
     
     
    //remplissage du dib avec le contenu RGB24 du buffer "buffer"
     
    if(buffer!=NULL)
    {
     
    for( y = 0; y < FreeImage_GetHeight(dib); y++) 
    	{
     
    				BYTE *bits = FreeImage_GetScanLine(dib, y);
     
    						for( x = 0; x < FreeImage_GetWidth(dib); x+=bytespp) 
    						{
    							// Set pixel color to green with a transparency of 128
    							bits[x] = buffer[x];
    							bits[x+1] = buffer[x+1];
     
     
     
    							bits[x+2] = buffer[x+2];
    							//bits[FI_RGBA_ALPHA] = 128;
    							// jump to next pixel
    							bits += bytespp;
     
    						}
    	}
    	// open and allocate a memory stream
    hmem = FreeImage_OpenMemory(popo,1024*1024);
    //compression
    FreeImage_SaveToMemory(FIF_JPEG,dib, hmem, 0);
     
     
    //fin compression
     
     
    // 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
    file_sizecompressed = FreeImage_TellMemory(hmem);
     
    printf("image compresser buffeuriser\n");
    //FreeImage_CloseMemory(hmem);
     
    file=fopen("compressedpicture.jpeg","w+");
     
    fwrite(hmem,file_sizecompressed,1,file);
     
    FreeImage_Unload(dib);
     
     
    }
    // close and free the memory stream
     
     
    	else 
    		printf("erreur grabbing\n");
     
     
    CloseVideo(&video);
    exit(0);	
     
    }
    j'ai vu dans la doc, que freeopenmemory demander en parametre un char * data et sa taille, j'ai donc allouer une char * popo, et donner une taille supérieur a mon fichier jpeg de sortie, sachant que ej sait que la taille est inférieur a 100ko, j'ai donner 1Mo.

    j'ai peut etre eu des ratés dans la compréhension,mais est ce que vous voyai des erreurs ?
    tout ce compile, et j'obtien un fichier de 3ko.....avec un autre code, l'image compresser provenant de buffer fait 70 ko.....le fichier obtenu n'est pas lisible, aucune image apparait.
    j'ai du me manqué...

  11. #11
    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
    C'est mieux déjà
    J'ai pas trop le temps tout de suite de tout regarder.
    Déjà la boucle for x devrait ressembler plustôtà truc comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for( x = 0; x < FreeImage_GetWidth(dib); x+=bytespp) 
    	{
             bits[FI_RGBA_RED] = buffer[(y*width+x)*3];
             bits[FI_RGBA_GREEN] = buffer[(y*width+x)*3+1];
             bits[FI_RGBA_BLUE] = buffer[(y*width+x)*3+2];
     
             bits += bytespp;//le pointeur passe au pixel suivant
    	}
    Tu cherche quoi. 0 avoir le jpeg en mémoire? ou avoir un fichier jpeg?

  12. #12
    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
    je cherche effectivement a avoir le jpeg en memoire du style :

    unsigned char * bobo = imagejpeg;

    et pas de open("imagejpegcompressed","w+");

    vraiment mon but est de travailler en buffer, je veut ensuite l'envoyer sur le réseau, c'est pour ça ke je veut travailler avec la mémoire seulement.
    Merci.

  13. #13
    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
    c'est exactement ça, a part que dans la boucle for, ce n'est pas x+=3, mais x++,
    par contre l'image est inverser, jpense qu'il faut metre pluto

    (for(y=getheight(dib),y>0,y--)
    ---

    for(x=getwidth(dib);x>0,x--)
    les pixel sont la,masi pas ds le bon ordre!! ya que la que ça se passe.
    Enfin vous m'avez bien avancez pour ceci et ej vous en remercie.
    par contre, je souhaite comme je vous l'ai dit précedemment, garder un buffer sans l'écrire sur le disk, est ce que je pourrai trouver la fonction frreimae_save,et en modifier le code pour justement qu'elle me renvoie le pointeur quelle écrit, je ne trouve pas la definition de la fonction freeimage_save, je cherche encore en ce moment meme.
    Merci.

  14. #14
    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
    en attendant je met le bout de code permettant de compresser un buffer de type unsigned char* contenant les valeur RGB24 d'une 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
    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
     
    	buffer=GrabVideo(&video,&width,&height,&depth);
     
    		FIBITMAP *dib = FreeImage_Allocate(width,height , depth, FI_RGBA_RED_MASK, FI_RGBA_GREEN_MASK, FI_RGBA_BLUE_MASK);
    // Calculate the number of bytes per pixel (3 for 24-bit or 4 for 32-bit)
    int bytespp = FreeImage_GetLine(dib) / FreeImage_GetWidth(dib);
     
    //remplissage du dib avec le contenu RGB24 du buffer "buffer"
     
    if(buffer!=NULL)
    {
     
    for( y =0 ; y <FreeImage_GetHeight(dib) ; y++) 
    	{
     
    				BYTE *bits = FreeImage_GetScanLine(dib, FreeImage_GetHeight(dib)-y);
     
    						for( x =0 ; x <FreeImage_GetWidth(dib) ; x++) 
    						{
    							// Set pixel color to green with a transparency of 128
    							bits[2] = buffer[(width*y+x)*3];
    							bits[1] = buffer[(width*y+x)*3+1];
    							bits[0] = buffer[(width*y+x)*3+2];
    							//printf("bufferx== %d\nbits=%d\n",buffer[x],bits[2]);
    							//bits[FI_RGBA_ALPHA] = 128;
    							// jump to next pixel
    							bits += bytespp;
     
    						}
    	}
    	// open and allocate a memory stream
    hmem = FreeImage_OpenMemory(0,0);
    //compressiong
    FreeImage_SaveToMemory(FIF_JPEG,dib, hmem, 0);
     
     
    //fin compression
     
     
    // 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
    file_sizecompressed = FreeImage_TellMemory(hmem);
     
    printf("image compresser buffeuriser\n");
    //FreeImage_CloseMemory(hmem);
    // 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
    //fwrite(check,sizeof(FIBITMAP*),file_size,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);
    FreeImage_Unload(dib);

  15. #15
    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
    je cherche effectivement a avoir le jpeg en memoire du style :

    unsigned char * bobo = imagejpeg;

    et pas de open("imagejpegcompressed","w+");

    vraiment mon but est de travailler en buffer, je veut ensuite l'envoyer sur le réseau, c'est pour ça ke je veut travailler avec la mémoire seulement.
    Merci.
    Bonjour. w+ ????
    il faut
    écrire en binaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open("imagejpegcompressed","wb");
    Dite si ça suffit.
    Sinon quand vous dite a l'envers. C'est sur les deux axes???
    Je pense que seul l'axe y est a l'envers
    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for( y =FreeImage_GetHeight(dib)-1 ; y >=0 ; --y)

Discussions similaires

  1. erreur memory stream avec FREEIMAGE
    Par aziatedu13 dans le forum Bibliothèques
    Réponses: 7
    Dernier message: 26/02/2008, 13h47
  2. Chargement d'une image avec FreeImage en C
    Par McBlender dans le forum Développement 2D, 3D et Jeux
    Réponses: 1
    Dernier message: 04/02/2008, 10h22
  3. Compression avec vfw (vidéo for Windows)
    Par ellipse2v dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 27/12/2007, 12h26
  4. compresser avec l'executable de huffman
    Par memo07 dans le forum C++Builder
    Réponses: 0
    Dernier message: 30/11/2007, 01h47
  5. Réponses: 2
    Dernier message: 13/01/2006, 10h11

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