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

C Discussion :

Le C et les images


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut Le C et les images
    Hello ^^ j'aimerais savoir si en C c'est possible de lire des fichiers images ( jpeg , bmp ,...) et aussi d'en écrire.

    Par exemple pour coder un fichier texte dans une image.

    Si oui j'aimerais bien connaitre les fonctions permettant de le faire lol

    merci ^^

  2. #2
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut,

    Ca te dit quelque chose les entrées-sorties en mode binaire? Si oui il ne reste plus qu'à se renseigner sur le format bmp et faire quelques fread.

    Mais en général certaines librairies sont utilisées pour lire/écrire des images; SDL, GTK+, libpng, libjpeg, GDI ... GTK+ est la plus puissante. En effet à la base cette lib a été écrite pendant le développement de GIMP.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Par défaut
    Pour GDI ( sous Windows ) on a :

    LoadBitmap(HINSTANCE,LPSTR); //Charge un BMP en fichier ou en ressource
    LoadImage(...je ne sais plus...); //Charge un BMP,ICO en fichier ou en ressource

    Mais bon, je ne suis plus sûr de mes sources, donc à vérifier...
    De plus, si c'est pour faire un jeu, le mieux c'est d'utiliser SDL ou Allegro ( Windows, Linux, MacOs, ... ).

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Charger ou écrire des images est possible en C standard, même si généralement on utilise des bibliothèques qui connaissent le format.

    Afficher une image par contre, n'est pas possible en C standard.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Okiiii merci pour vos réponses

    - Donc les entrées sorties en mode binaire je connais pas mais je suppose que c'est comme fprintf fscanf avec des 0 et 1 sinon oui je vais aller me renseigner sur le format bmp
    En plus mon programme est écrit en GTK+ mais je ne connais pas beaucoup les fonction rattachées aux images lol


    - " Le terme anglais Graphics Device Interface (ou Graphical Device Interface) abrégé en GDI, est l’un des trois composants fondamentaux ou sous-systèmes du système d’exploitation Microsoft Windows. "

    Ca non plus je ne savais pas :p ca m'a l'air pas mal je vais voir pour éventuellement m'en servir

    Mais ce n'est pas pour faire un jeu c'est simplement pour coder un dictionnaire dans une image ( en gros chaque caractère du dictionnaire correspondrait à un pixel )


    - Oki Médinoc enfin par afficher j'entendais plutot " lire " comme lire dans un fichier et non afficher à l'écran ^^


    PS: j'ai entendu parler de fichiers " ppm " qui sont de simples fichiers textes avec une en-tête et une fois ce fichier écrit il suffirait d'appliquer une fonction nommée " convert " pour transformer ca en image quelqu'un connait cette fonction convert ? j'ai cherché un peu je n'ai malheuresement rien trouvé lol


    merci ^^

  6. #6
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    GTK+ est la plus puissante. En effet à la base cette lib a été écrite pendant le développement de GIMP.
    Nan, GTK sert uniquement pour l'aspect gestion de l'IHM de GIMP, GTK n'a rien à voir avec les fonctionnalités presentes dans GIMP (modification sur les couleurs, filtres...).

    Vous citez des bibliotheques permettant l'affichage des images, ce qu'il veut c'est surtout retraiter l'image, sans forcement avoir d'interface graphique
    Ya GD pour ça

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et le package ppm/pnm :

    http://www.acme.com/software/pbmplus/

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    merci c'est sympa je l'ai téléchargé mais la doc est inexistante ou alors je suis aveugle lol. enfin j'ai regardé sur google comme ici et rien vu qui donnait les fonctions de lecture et d'écriture

    je pourrais bien lire les 150 .c à leur recherche mais si tu pouvais me les passer ca serait plus sympa lol


    merci ^^

    ( je voudrais juste les commandes permettant de lire un fichier image pixel par pixel et l'inverse : écrire pixel par pixel )

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    ben ya pas un répertoire doc ??

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    mouarf si, il y a bien un readme mais dans le zip il était sous formar inconnu donc j'avais pas vu le petit icone texte du bloc note lol ^^

    merci jvais me débrouiller avec ca

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 174
    Par défaut GDI in Windows
    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
     
    HBITMAP hBmp;
    LPSTR lpszFileName;
    COLORREF dwPixel;
    HDC hDC;
    BITMAP BMPObj;
     
    //Chargement de l'image BMP
    hBmp=LoadImage(NULL,lpszFileName,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE);
     
    //On recupère les infos du BMP
    GetObject(hBmp,sizeof(BITMAP),&BMPObj);
     
    //Infos : BMPObj.bmWidth = Largeur
    //          BMPObj.bmHeight = Hauteur
    //          BMPObj.bmBitsPixel = Bits par pixel
     
    //Pour + d'infos cf MSDN
     
    //Device context pour acceder au contenu de l'image
    hDC=CreateCompatibleDC(NULL);
    //Selection du BMP
    SelectObject(hDC,hBmp);
     
    //Pixel à x,y
    //COLORREF : pixel sous la forme 0x00BBGGRR
    dxPixel=GetPixel(hDC,x,y);
     
    //Libère le DC
    DeleteDC(hDC);
     
    //Libère le BMP de la mem
    DeleteObject(hBmp);

  12. #12
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Citation Envoyé par NeMo_O
    En plus mon programme est écrit en GTK+ mais je ne connais pas beaucoup les fonction rattachées aux images lol
    Alors regardes la référence GTK+, section GdkPixbuf http://developer.gnome.org/doc/API/
    Et là un exemple pour travailler les pixels http://developer.gnome.org/doc/API/2...dk-pixbuf.html

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    - Nyarlathotep merci pour le code ^^ mais je t'avoues franchement que je n'y comprends pas grand chose lol j'ai tout de même trouvé un site qui explique sommairemment quelques fonctions ( handle et tout le bazar ) mais tu n'aurais pas un autre tuto ou cours qui expliquerait tout en détail ?

    Car ton code me parait bien mais j'aimerais le comprendre plutot que de copier betement lol ( et pour utiliser HBITMAP et tout il ne faut pas inclure un .h ou autre ? )

    - Lunixinclar merci pour les liens ca m'a apprit quelque chose mais mon but n'est pas vraiment d'afficher les pixels à l'écran : je veux avoir un autre support qu'un fichier texte pour stocker des caractères ^^ à chaque pixel en gros t'associes un caractère donc si j'arrive à faire ça ensuite je pourrais l'afficher dans GTK+ pour voir le résultat grace aux fonctions que tu ma passé


    Merci à vous

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Le code utilisé utilise les fonctions de Windows (déclarées en incluant <windows.h>) pour charger rapidement l'image bitmap en mémoire et obtenir un accès à ses pixels.

    Windows propose également des fonctions pour afficher l'image en question, en fait toutes ces fonctions font partie de la même API, la Windows GDI.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    D'acc ^^ merci au moins je ne passerais pas 2 heures à me demander " zut le compilateur ne connait pas HBITMAP " si je n'avais pas inclu windows.h lol

    Mais je viens à l'instant d'entendre qu'un bmp est un simple fichier " texte " binaire. C'est vrai ? si oui ça serait vachement plus facile, juste un fread et puis un "f_écrire_dans_le_fichier" (connait pas la fonction en mode binaire lol ) et voilà apparemment je n'aurais besoin de rien d'autre.

    Ecrire l'en tete, écrire les données et le tour serait joué :p

  16. #16
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par NeMo_O
    D'acc ^^ merci au moins je ne passerais pas 2 heures à me demander " zut le compilateur ne connait pas HBITMAP " si je n'avais pas inclu windows.h lol

    Mais je viens à l'instant d'entendre qu'un bmp est un simple fichier " texte " binaire. C'est vrai ? si oui ça serait vachement plus facile, juste un fread et puis un "f_écrire_dans_le_fichier" (connait pas la fonction en mode binaire lol ) et voilà apparemment je n'aurais besoin de rien d'autre.

    Ecrire l'en tete, écrire les données et le tour serait joué :p
    C'est vrai mais le format tga est plus simple. Le format BMP a tout de même certaines particularités...

    Jc

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Ouf merci de soutenir que c'est vrai lol je suis soulagé ^^. En fait je voulais simplement utiliser le format bmp pour coder un caractère ( un bit ) par pixel.

    Ok je vais me renseigner sur le format TGA:

    " Le format Tga (Targa : Truevision Advanced Raster Graphics Adapter), créé par TrueVision, est destiné à l'image RVB, il est donc utilisable sur écran mais pas pour l'impression. Le mode TGA couvre toutes les profondeurs de couleurs du 1 au 32 bits. Il peut stocker une couche transparente Alpha et diverses autres informations. "

    Ca m'a l'air de contenir beaucoup d'informations... Ca ne prendra pas plus de place que du bmp par hasard ? ( Déjà que mon dictionnaire fait 15 Mo lol je racontes pas la taille de l'image lol )


    Merci

  18. #18
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par NeMo_O
    Ouf merci de soutenir que c'est vrai lol je suis soulagé ^^. En fait je voulais simplement utiliser le format bmp pour coder un caractère ( un bit ) par pixel.

    Ok je vais me renseigner sur le format TGA:

    " Le format Tga (Targa : Truevision Advanced Raster Graphics Adapter), créé par TrueVision, est destiné à l'image RVB, il est donc utilisable sur écran mais pas pour l'impression. Le mode TGA couvre toutes les profondeurs de couleurs du 1 au 32 bits. Il peut stocker une couche transparente Alpha et diverses autres informations. "

    Ca m'a l'air de contenir beaucoup d'informations... Ca ne prendra pas plus de place que du bmp par hasard ? ( Déjà que mon dictionnaire fait 15 Mo lol je racontes pas la taille de l'image lol )


    Merci
    Non, car le tga n'a pas de padding par exemple. Il peut stocker une couche transparente mais pas si tu n'en as pas besoin.

    Jc

  19. #19
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Un fichier est soit texte soit binaire. On parle de fichier binaire dès l'instant où il y a autre chose que du texte.
    • Un fichier texte, on le lit la plupart du temps avec des fonctions comme fgets() ou fgetc().
    • Un fichier binaire, ça se lit généralement à coups de fread().


    Un fichier .bmp, c'est un fichier binaire avec un format donné. Si tu lis le lien "Storing an Image", sur l'autre thread, tu verras comment un programme enregistre le bitmap :
    • D'abord une structure BITMAPFILEHEADER,
    • puis une structure BITMAPINFOHEADER,
    • un certain nombre (qui peut être zéro) de structures RGBQUAD,
    • puis les valeurs des pixels.

    Tu peux lire le bitmap ainsi, ensuite c'est à toi de décider ce que tu veux en faire. Tu peux en faire un HBITMAP pour l'afficher sous Windows, travailler dessus directement sans l'afficher, etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 176
    Par défaut
    Voilà Médinoc j'ai essayé comme tu m'as dis ^^ mais... ça ne marche qu'à moitié disons lol voilà le code tout simple que j'ai fait :

    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
     
    #include <stdio.h>
     
    int main(void)
    {
    FILE *fp;
     
    fp = fopen("img.bmp","rb"); // ouveture en mode binaire
     
      if( fp != NULL)
      {
      char tab[1000];
     
      fread(tab,2,1,fp); // lire un élément de deux octets
      printf("%s\n",tab);
     
      fread(tab,4,1,fp); // de quatre octets ( taille du fichier )
      printf("%s\n",tab);
      }
     
    return 0;
    }
    En sortie j'obtient bien le "BM" lors du premier fread mais lors du second rien ne s'affiche hormis un passage à la ligne. Pourtant je devrais avoir la taille du fichier sur 4 octets.


    Merci pour vos explications.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [D5][SQL Server] Conserver des images dans la BDD
    Par FONKOU dans le forum Bases de données
    Réponses: 8
    Dernier message: 08/06/2008, 19h58
  2. Recherche librairies pour les images
    Par mathieu_t dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 16/08/2004, 21h14
  3. les images dans une base de données
    Par houhou dans le forum Bases de données
    Réponses: 8
    Dernier message: 22/06/2004, 14h27
  4. []filtre sepia pour les images
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 27/01/2004, 20h41
  5. Des fonctions OGL pour les images de format usuel ?
    Par jamal24 dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/05/2003, 21h59

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