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
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
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.
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
C'est plutôt à toi d'en fournir d'avantage... C'est très vague ce que tu demandes.Il me faudrait néanmoins davantage de précision
Le charger dans quoi ?Mais comment charger le fichier image?
Texture -> D3DXCreateTextureFromFile(Ex)
Surface -> D3DXCreateSurfaceFromFile(Ex)
Tu verrouilles ta texture/surface, tu copies les pixels, puis tu déverrouilles.Comment acceder aux données brutes de l'image?
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.
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
Mes questions:
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 );
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
Une texture est simplement une collection de surfaces (les niveaux de mipmapping). Donc pour ce que tu veux faire, une surface fera l'affaire.1) Texture / surface: c'est quoi la différence? Sont t-ils appropriés pour charger une image?
D3DXLoadSurfaceFromFile. Faut chercher un peu quand même, je ne suis pas aussi fiable que la documentation du SDK.De toute facon, y'a aucune fonction du nom de D3DXCreateSurfaceFromFile
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).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.
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.
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.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é?
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.
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?
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.
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).Ca risque pas, une fois compilé, de planter sur des ordis avec une version plus vieille de DirectX ou sans carte 3D??
Je ne pense pas que tu charges tes images en temps réel, donc est-ce vraiment important ?D'après toi quelle méthode serait la plus rapide à l'execution?
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.
Monsieur Charlemagne ( sacré tout de même) , tout écrit là :
http://www.developpez.net/forums/viewtopic.php?t=159308
aie aie on est mal barré !!Je sais même pas ce qu'est le GDI.
Le GDI ce sont les fonctions de tracé à l'écran contenues dans la dll gdi32.dll ( et pour NET gdiplus.dll)
Direct X c'est fait pour du multimédia et jeuxvidéos.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.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager