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

DirectX Discussion :

Comment lire un fichier image


Sujet :

DirectX

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut Comment lire un fichier image
    Salut

    Je voudrais savoir si quelqu'un connait une méthode en C++ pour lire un fichier image, de n'importe quel format, avec DirectX ou non.
    Un petit exemple, ou un lien vers un tutorial serait le bienvenu.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il existe bon nombre de bibliothèques pour traiter les différents formats d'images, le tout est de savoir ce que tu veux en faire après.

    Si c'est pour une utilisation avec DirectX, tu devrais trouver la fonction correspondante à ce que tu cherches dans les D3DX***FromFile.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Merci de m'aider.
    Il me faudrait néanmoins davantage de précision.

    A priori je préfèrerais utiliser DirectX à toute autre librairie, pour éviter des dépendances pour mon projet avec d'autres librairies.
    Même si je trouve DirectX abobinablement compliqué.

    J'ai vu des instructions telles que D3DXGetImageInfo, D3DXCreateTextureFromFile, D3DXLoadSurfacefromFile.

    -Mais comment charger le fichier image?
    Je vois pas de nom du genre LoadImageFromFile. Une surface ou texture peut-elle être assimilée à une image?
    -Comment acceder aux données brutes de l'image? Je voudrait copier l'image dans mon propre tableau

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Il me faudrait néanmoins davantage de précision
    C'est plutôt à toi d'en fournir d'avantage... C'est très vague ce que tu demandes.

    Mais comment charger le fichier image?
    Le charger dans quoi ?
    Texture -> D3DXCreateTextureFromFile(Ex)
    Surface -> D3DXCreateSurfaceFromFile(Ex)

    Comment acceder aux données brutes de l'image?
    Tu verrouilles ta texture/surface, tu copies les pixels, puis tu déverrouilles.
    C'est très bien expliqué dans la doc du SDK, pour peu que tu te donnes la peine de le lire et d'y faire quelques recherches. Google est très bien aussi lorsque le SDK devient limite.

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Je vois pas quoi dire de plus pour dire ce que je veux faire:
    Charger une image du disque dur (BMP,JPG...) et copier son contenu décompressé dans un tableau que j'aurais alloué au préalable.

    Je débute avec DirectX, mais franchement je comprends pas pourquoi il faut 36 instructions avant d'y arriver, enfin bref...
    J'ai installé SDK 9.0 et j'y vois honnetement aucun exemple s'approchant de mon problème

    Sinon j'ai vu cet exemple sur internet (et d'autres), qui montre comment charger une texture, mais pas comment la manipuler. En voici un extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    lp_Texture=NULL;
    D3DXIMAGE_INFO fileInfo={NULL};
    D3DXGetImageInfoFromFile(filename,&fileInfo);
    width =fileInfo.Width;
    height=fileInfo.Height;
    D3DXIMAGE_INFO d3dxImageInfo;
    D3DXCreateTextureFromFileEx( *lp_Device, filename, fileInfo.Width, fileInfo.Height, 1, D3DPOOL_DEFAULT, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, D3DX_DEFAULT, D3DX_DEFAULT, colourKey, &d3dxImageInfo, NULL, &lp_Texture );
    Mes questions:

    1) Texture / surface: c'est quoi la différence? Sont t-ils appropriés pour charger une image?
    De toute facon, y'a aucune fonction du nom de D3DXCreateSurfaceFromFile

    2)Ca sert à quoi de verrouiller/deverrouiller?
    Dans IDirect3DTexture9, je ne vois que Lockrect et Unlockrect. Je comprends pas à quoi servent les paramètres transmis.

    3)Je vois pas de fonction qui permette un acces aux pixels de l'image.
    Si tel est le cas, c'est pourrait se réveler être un peu long de faire une copie de chaque image chargée, y'aurait pas moyen charger les pixels dans une zone mémoire que j'aurais préalablement alloué?

    Merci

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    1) Texture / surface: c'est quoi la différence? Sont t-ils appropriés pour charger une image?
    Une texture est simplement une collection de surfaces (les niveaux de mipmapping). Donc pour ce que tu veux faire, une surface fera l'affaire.

    De toute facon, y'a aucune fonction du nom de D3DXCreateSurfaceFromFile
    D3DXLoadSurfaceFromFile. Faut chercher un peu quand même, je ne suis pas aussi fiable que la documentation du SDK.

    2)Ca sert à quoi de verrouiller/deverrouiller?
    Dans IDirect3DTexture9, je ne vois que Lockrect et Unlockrect. Je comprends pas à quoi servent les paramètres transmis.
    Verrouiller/deverrouiller sert à accéder au contenu d'une ressource. Bien souvent, cette ressource est placée en mémoire vidéo, donc tu ne peux pas y accéder "à l'arrache" comme tu le ferais avec un tableau en mémoire centrale. Ceci dit, il faut verrouiller même les ressources placées en mémoire système (a priori ton cas ne nécessitera pas de créer une surface en mémoire video, si tu veux seulement copier son contenu ailleurs).
    Lockrect et Unlockrect sont justement les fonctions que tu dois utiliser, bien vu...
    Le 1er paramètre de LockRect est un pointeur sur une structure D3DLOCKED_RECT, qui sera au retour de la fonction correctement remplie avec tout ce qu'il te faut, par exemple un pointeur pour accéder aux les pixels de la surface.
    Le 2ème paramètre permet de spécifier quelle zone verrouiller, si tu veux verrouiller toute la surface mets simplement NULL.
    Le dernier paramètre c'est le flag de verrouillage, pour spécifier de quelle manière tu veux effectuer ton verrouillage. Là a priori t'as pas besoin de mettre autre chose que 0.

    3)Je vois pas de fonction qui permette un acces aux pixels de l'image.
    Si tel est le cas, c'est pourrait se réveler être un peu long de faire une copie de chaque image chargée, y'aurait pas moyen charger les pixels dans une zone mémoire que j'aurais préalablement alloué?
    Créer une surface en mémoire système, mais pour y accéder il faudra toujours verrouiller/deverrouiller. Sinon, pour avoir tes surfaces dans des tableaux que tu alloues toi-même, la copie systématique est inevitable.


    Voilà. Maintenant ma conclusion : pour ce que tu souhaites faire, les fonctions DirectX ne sont pas adaptées. Essaye plutôt une bibliothèque externe (je n'en ai pas en tête, désolé. Peut-être DevIL ?) qui fera beaucoup plus simplement le travail que tu souhaites réaliser. Il en existe une fournée, cherche sur Google tu devrais trouver ton bonheur.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    J'y vois plus clair. Merci

    Effectivement DirectX n'est pas adapté, mais j'aimerais minimiser les dépendences de mon projet. Et comme DirectX est de facto un standart...

    Je trouve bizarre d'utiliser une bibliothèque 3D pour charger une image. Ca risque pas, une fois compilé, de planter sur des ordis avec une version plus vieille de DirectX ou sans carte 3D??

    Sinon j'ai remarqué l'instruction GetBitmapBits, ca semble fait pour recupérer une image d'une video à n'importe quel instant. Peut-être que ça marche avec une image en fixant l'instant t=0?
    Avec cette méthode aussi, il faudrait en écrire 3 pages avant d'y arriver.
    La aussi une copie dans le tableau semble inévitable.

    D'après toi quelle méthode serait la plus rapide à l'execution?

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    A mon avis, puisque ce n'est pas du temps réel, tu devrais utiliser le GDI (LoadBitmap et GetPixel). Ce sera beaucoup plus simple je pense. Par contre je ne peux pas te dire si ça supporte autre chose que du BMP.

    Ca risque pas, une fois compilé, de planter sur des ordis avec une version plus vieille de DirectX ou sans carte 3D??
    Pour la carte graphique je ne pense pas, le chargement d'image (enfin pour ce que tu veux faire en tout cas) ne fait pas intervenir le GPU, donc aucun problème. Par contre, à partir du moment où tu utilises une certaine version de Dx, il faut évidemment que la machine où tournera l'appli ait la même version (ou plus récente).

    D'après toi quelle méthode serait la plus rapide à l'execution?
    Je ne pense pas que tu charges tes images en temps réel, donc est-ce vraiment important ?

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    J'ai trouvé les fonctions du GDI que tu mentionnes, mais j'ai pas encore cherché à voire comment elles s'utilisent. Je sais même pas ce qu'est le GDI.
    Effectivement, cela semble être une solution plus directe à mon problème.
    Je vais tâcher de voire si ca marche avec d'autres formats tels que JPG.

    La question de la vitesse de chargement est quand même assez importante vu qu'il est prévu de l'intégrer à une libraire de traitement de l'image, qui doit parfois faire des calculs sur de nombreuses images. Cette librairie ne peut toutefois jusqu'à présent charger que qqs formats simples d'images. D'où l'idée d'un interface avec DirectX pour charger les images et les videos.

  10. #10
    mat.M
    Invité(e)
    Par défaut
    Monsieur Charlemagne ( sacré tout de même) , tout écrit là :

    http://www.developpez.net/forums/viewtopic.php?t=159308


    Je sais même pas ce qu'est le GDI.
    aie aie on est mal barré !!
    Le GDI ce sont les fonctions de tracé à l'écran contenues dans la dll gdi32.dll ( et pour NET gdiplus.dll)


    La question de la vitesse de chargement est quand même assez importante vu qu'il est prévu de l'intégrer à une libraire de traitement de l'image, qui doit parfois faire des calculs sur de nombreuses images. Cette librairie ne peut toutefois jusqu'à présent charger que qqs formats simples d'images. D'où l'idée d'un interface avec DirectX pour charger les images et les videos.
    Direct X c'est fait pour du multimédia et jeuxvidéos.
    Le problème c'est que contrairement à une appli fenêtrée GDI , on n'a pas tous les contrôles ( boutons , listes etc...) car ils s'affichent mal .
    Sinon il ya Direct X fenêtré mais ça rame autant qu'une appli avec GDI normale.
    Donc pour du traitement d'image mieux vaut développer une appli sans Direct X

Discussions similaires

  1. [Excel] Comment lire des fichiers excel avec php?
    Par dear_rihab dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 02/11/2007, 12h38
  2. Comment lire un fichier XML ?
    Par jeromelef dans le forum Débuter
    Réponses: 6
    Dernier message: 29/06/2005, 15h52
  3. [BCB 5]Comment lire un fichier AVI avec un TAnimate ?
    Par Sitting Bull dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/09/2004, 11h57
  4. Comment lire un fichier DB en cours d'utilisation par 1 autr
    Par jbat dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/03/2004, 11h06

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