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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    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 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,
    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 confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    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 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 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 confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    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 confirmé
    Inscrit en
    Janvier 2007
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 170
    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
    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
    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;
    }

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