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 :

[Recherche] Une Bibliothèque légère HBITMAP -> Fichier PNG


Sujet :

Bibliothèques

  1. #1
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut [Recherche] Une Bibliothèque légère HBITMAP -> Fichier PNG
    Bonjour à tous.
    Dans le cadre d'une application C++, je cherche une bibliothèque la plus légère possible (pas forcément optimisée en rapidité d'execution) qui me permette d'écrire un fichier PNG à partir d'un HBITMAP.

    J'ai parcouru tout SourceForge à la recherche de ce joyaux, mais je ne trouve que des tanks, alors que je veux tuer une mouche
    Si vous pouvez m'aider à trouver ça, je vous vénèrerai tout les soir
    Merci de votre aide.

    Edit : Après réflexion, si vous me donnez juste un moyen de convertir un hbitmap en .png ça me va aussi
    -- Yankel Scialom

  2. #2
    Membre actif Avatar de Nyarlathotep
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    174
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Points : 217
    Points
    217
    Par défaut
    J'ai trouvé une fonction qui fait l'inverse. Ca peut peut-être t'aider.
    Par contre, il faut la lib libpng.

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    #include <windows.h>
     
    // requires libpng
    #include "png.h"
     
    // prototypes, optionally connect these to whatever you log errors with
     
    void PNGAPI user_error_fn(png_structp png, png_const_charp sz) { }
    void PNGAPI user_warning_fn(png_structp png, png_const_charp sz) { }
     
    HBITMAP LoadBitmapPNG(LPCTSTR szFile)
    {
    HBITMAP hbm = NULL;
     
    bool retVal = false;
    int size = 0;
    // check the header first
    FILE *fp = fopen(szFile, "rb");
    if (!fp)
    return false;
    BYTE header[8];
    fread(header, 1, 8, fp);
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fclose(fp);
    if (png_sig_cmp(header, 0, 8))
    return false;
    // now allocate stuff
    png_structp png_ptr = 
    png_create_read_struct(PNG_LIBPNG_VER_STRING, 
    NULL, user_error_fn, user_warning_fn);
    if (!png_ptr)
    return false;
    png_infop info_ptr = png_create_info_struct(png_ptr);
    if (!info_ptr)
    {
    png_destroy_read_struct(&png_ptr,
    (png_infopp)NULL, (png_infopp)NULL);
    return false;
    }
     
    png_infop end_info = png_create_info_struct(png_ptr);
    if (!end_info)
    {
    png_destroy_read_struct(&png_ptr, &info_ptr,
    (png_infopp)NULL);
    return false;
    }
     
    fp = fopen(szFile, "rb");
    if (fp)
    {
    png_init_io(png_ptr, fp);
     
    // should really use png_set_rows() to allocate space first, rather than doubling up
     
    png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING, NULL);
     
    fclose(fp);
     
    png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);//new png_bytep[info_ptr->height];
     
    // now for a tonne of ugly DIB setup crap
     
    int width = info_ptr->width;
    int height = info_ptr->height;
    int bpp = info_ptr->channels * 8;
    int memWidth = (width * (bpp >> 3) + 3) & ~3;
     
    LPBITMAPINFO lpbi = (LPBITMAPINFO) new char[sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD))];
     
    // create a greyscale palette 
    for (int a_i = 0; a_i < 256; a_i++)
    {
    lpbi->bmiColors[a_i].rgbRed = (BYTE)a_i;
    lpbi->bmiColors[a_i].rgbGreen = (BYTE)a_i;
    lpbi->bmiColors[a_i].rgbBlue = (BYTE)a_i;
    lpbi->bmiColors[a_i].rgbReserved = 0;
    }
     
    lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbi->bmiHeader.biWidth = width;
    lpbi->bmiHeader.biHeight = -height; // must be negative for top down
    lpbi->bmiHeader.biPlanes = 1;
    lpbi->bmiHeader.biBitCount = bpp;
    lpbi->bmiHeader.biCompression = BI_RGB;
    lpbi->bmiHeader.biSizeImage = memWidth * height;
    lpbi->bmiHeader.biXPelsPerMeter = 0;
    lpbi->bmiHeader.biYPelsPerMeter = 0;
    lpbi->bmiHeader.biClrUsed = 0;
    lpbi->bmiHeader.biClrImportant = 0;
     
    BYTE * pixelData;
    hbm = CreateDIBSection(NULL, lpbi, DIB_RGB_COLORS, (void **)&pixelData, NULL, 0 );
    if (hbm && pixelData)
    {
    // now copy the rows
    for (int i = 0; i < height; i++)
    memcpy(pixelData + memWidth * i, row_pointers[i], width * info_ptr->channels);
    }
     
    delete (char*) lpbi;
    }
     
    png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
     
    return hbm;
    }
    "That is not dead which can eternal lie
    And with strange aeons even death may die"

    The Call of Cthulhu

  3. #3
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour.
    C'est très gentil, mais je cherche quelque chose de très léger, donc sans libpng. Je suis aussi preneur pour une simple fonction HBitmap2png, sans lib.

    Merci à tous.
    -- Yankel Scialom

  4. #4
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut je voulais d'abord dire merci à Nyarlathotep pour le code mentionné plus haut. D'ailleurs on peut le trouver ici: http://intepid.com/stuff/source/LoadBitmapPNG.cpp

    Ensuite, je voulais mettre ici les modifications que j'ai apporté au code pour le faire fonctionner en C, ce n'est pas que je n'aime pas le C++, c'est juste que le projet sur lequel je travaille est en C J'ai seulement remplacer le new par un calloc suivi d'un if pour vérifier si la mémoire est alloué, j'ai aussi tout déclaré mes variables en haut de ma fonction (on ne peut pas déclarer des variables n'importe où en C).

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    HBITMAP LoadBitmapPNG(LPCTSTR szFile)
    {
        int size = 0, width, height, bpp, memWidth, i;
        HBITMAP hbm = NULL;
        LPBITMAPINFO lpbi;
        BOOL retVal = FALSE;
        FILE *fp;
        BYTE header[8], *pixelData;
        png_infop info_ptr, end_info;
        png_bytep *row_pointers;
        png_structp png_ptr;
     
        // check the header first
        fp = fopen(szFile, "rb");
        if (!fp)
            return FALSE;
     
        fread(header, 1, 8, fp);
        fseek(fp, 0, SEEK_END);
        size = ftell(fp);
        fclose(fp);
     
        if (png_sig_cmp(header, 0, 8))
            return FALSE;
     
        // now allocate stuff
     
        png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
     
        if (!png_ptr)
            return FALSE;
     
        info_ptr = png_create_info_struct(png_ptr);
        if (!info_ptr)
        {
            png_destroy_read_struct(&png_ptr,
                (png_infopp)NULL, (png_infopp)NULL);
            return FALSE;
        }
     
        end_info = png_create_info_struct(png_ptr);
        if (!end_info)
        {
            png_destroy_read_struct(&png_ptr, &info_ptr,
                (png_infopp)NULL);
            return FALSE;
        }
     
        fp = fopen(szFile, "rb");
        if (fp)
        {
            png_init_io(png_ptr, fp);
     
            // should really use png_set_rows() to allocate space first, rather than doubling up
     
            png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND | PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING, NULL);
     
            fclose(fp);
     
            row_pointers = png_get_rows(png_ptr, info_ptr);//new png_bytep[info_ptr->height];
     
                // now for a tonne of ugly DIB setup crap
     
            width = info_ptr->width;
            height = info_ptr->height;
            bpp = info_ptr->channels * 8;
            memWidth = (width * (bpp >> 3) + 3) & ~3;
     
            lpbi = (LPBITMAPINFO) calloc(1, sizeof(BITMAPINFOHEADER) + (256 * sizeof(RGBQUAD)));
     
            if(lpbi)
            {
                    // create a greyscale palette
                for (i = 0; i < 256; i++)
                {
                    lpbi->bmiColors[i].rgbRed = (BYTE)i;
                    lpbi->bmiColors[i].rgbGreen = (BYTE)i;
                    lpbi->bmiColors[i].rgbBlue = (BYTE)i;
                    lpbi->bmiColors[i].rgbReserved = 0;
                }
     
                lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
                lpbi->bmiHeader.biWidth = width;
                lpbi->bmiHeader.biHeight = -height; // must be negative for top down
                lpbi->bmiHeader.biPlanes = 1;
                lpbi->bmiHeader.biBitCount = bpp;
                lpbi->bmiHeader.biCompression = BI_RGB;
                lpbi->bmiHeader.biSizeImage = memWidth * height;
                lpbi->bmiHeader.biXPelsPerMeter = 0;
                lpbi->bmiHeader.biYPelsPerMeter = 0;
                lpbi->bmiHeader.biClrUsed = 0;
                lpbi->bmiHeader.biClrImportant = 0;
     
                hbm = CreateDIBSection(NULL, lpbi, DIB_RGB_COLORS, (void **)&pixelData, NULL, 0 );
                if (hbm && pixelData)
                {
                        // now copy the rows
                    for (i = 0; i < height; i++)
                        memcpy(pixelData + memWidth * i, row_pointers[i], width * info_ptr->channels);
                }
     
                free(lpbi);
            }
        }
     
        png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
     
        return hbm;
    }
    prgasp77 pour toi je n'ai rien
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  5. #5
    Membre émérite
    Avatar de prgasp77
    Homme Profil pro
    Ingénieur en systèmes embarqués
    Inscrit en
    Juin 2004
    Messages
    1 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur en systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 306
    Points : 2 466
    Points
    2 466
    Par défaut
    Bonjour. Finalement j'utilise bien LibPNG. Je tente de transformer mon HBITMAP en png, je vais étudier vos codes.

    Si vous avez du nouveau, goto http://www.developpez.net/forums/sho...d.php?t=357052 Merci à vous deux.
    -- Yankel Scialom

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, je voulais juste ajouter quelque chose par rapport au code paru plus haut. Les couleurs de mes images étais étrange, donc pour régler le problème j'ai ajouter l'argument PNG_TRANSFORM_BGR à la fonction png_read_png.

    Je le mentionne juste au cas où sa pourrais aidé quelqu'un dans le futur
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

Discussions similaires

  1. Recherche une bibliothèque de désassemblage
    Par yann458 dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 17/08/2011, 10h51
  2. Une bibliothèque pour lire des fichiers zip
    Par coyotte507 dans le forum C++
    Réponses: 5
    Dernier message: 13/10/2009, 16h32
  3. Réponses: 1
    Dernier message: 12/07/2009, 13h29
  4. Rechercher une valeur dans un autre fichier
    Par devock dans le forum Excel
    Réponses: 3
    Dernier message: 03/11/2008, 15h49
  5. Réponses: 2
    Dernier message: 13/11/2007, 15h37

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