Page 1 sur 1

structure d'un bmp

Publié : jeu. 25/janv./2007 17:20
par cha0s
pour la gestion des textures pour DM3D j'utilise des images que je crée et modifie en memoire pour plus de souplesse mais je suis perdue avec le bmp voicie mon code pour crée une image de 2x2 .
(je me suis insipré de ce site)
si quelqu'un avait une idée de mon ereur sa maiderait bien.

Code : Tout sélectionner

Procedure CreateTextureInMemory(c4, c3, c2, c)
  Protected  *adr,  *FileAdr  

  *adr = AllocateMemory(66)
  *FileAdr = *adr
  
  ;premier header
  PokeB(*adr, 66) ;B
  *adr+1
  PokeB(*adr, 77) ;M
  *adr+1
  PokeL(*adr, 66) ;taille de l'image
  *adr+4
  PokeB(*adr, 0) ;bfReserved1
  *adr+1
  PokeB(*adr, 0) ;bfReserved1
  *adr+1
  PokeB(*adr, 0) ;bfReserved2
  *adr+1
  PokeB(*adr, 0) ;bfReserved2
  *adr+1  
  PokeL(*adr, 54) ;Offset des bits du bitmap dans le fichier
  *adr+4
  
  ;second header
  PokeL(*adr, 40) ;Taille de cette structure en octets
  *adr+4
  PokeL(*adr, 2) ;Largeur du bitmap en pixel.
  *adr+4
  PokeL(*adr, 2) ;Hauteur du bitmap en pixel
  *adr+4
  PokeW(*adr, 1) ;1
  *adr+2
  PokeW(*adr, 24) ;bits
  *adr+2
  PokeL(*adr, 0) ;compression (le reste du header est facultatif si 0)
  *adr+4
  PokeL(*adr, 0) ;taille du fichier (pour compression)
  *adr+4
  PokeL(*adr, 0) ;Résolution horizontale en pixels par mètre
  *adr+4
  PokeL(*adr, 0) ;Résolution verticale en pixels par mètre.
  *adr+4
  PokeL(*adr, 0) ;Nombre de couleurs utilisées dans l’image.
  *adr+4
  PokeL(*adr, 0) ;Nombre de couleurs importantes.
  *adr+4
  
  
  *adr+1
  PokeB(*adr, Blue(c));bleu
  *adr+1
  PokeB(*adr, Green(c));vert
  *adr+1
  PokeB(*adr, Red(c));rouge
  *adr+1
  PokeB(*adr, Blue(c2));bleu
  *adr+1
  PokeB(*adr, Green(c2));vert
  *adr+1
  PokeB(*adr, Red(c2));rouge


  *adr+1
  PokeB(*adr, Blue(c3));bleu
  *adr+1
  PokeB(*adr, Green(c3));vert
  *adr+1
  PokeB(*adr, Red(c3));rouge
  *adr+1
  PokeB(*adr, Blue(c4));bleu
  *adr+1
  PokeB(*adr, Green(c4));vert
  *adr+1
  PokeB(*adr, Red(c4));rouge

  
  ProcedureReturn *FileAdr  
EndProcedure

Publié : jeu. 25/janv./2007 18:23
par Backup
n'oublie pas que

Chaque ligne de l'image doit comporter un nombre total d'octets qui soit un multiple de 4 sinon la ligne doit etre completée avec des zero

Publié : ven. 26/janv./2007 12:56
par cha0s
efectivement j'avais prit en compte ce parametre dans une version precedente, je peut exporter mes images en bitmap valide pour paint et autre mais DM3D n'en veut toujours pas je vais chercher autrement ...

Publié : ven. 26/janv./2007 19:11
par Backup
ton entete est pourtant correcte ! :)

Publié : ven. 26/janv./2007 19:13
par cha0s
je pense aussi et le sdk de direct X est clair le bmp est un des format surporté par la comande que j'utilise.

Publié : ven. 26/janv./2007 19:54
par tmyke
T'as pas de soucis avec les bmp 'tout fait', ou exportés avec un prog de dessin ?

Publié : ven. 26/janv./2007 20:45
par Dr. Dri
premièrement, il faudrait éclaircir le code, c'est commenté, je suis d'accord mais on pourrait aussi passer par les structures (elles servent à ça)

Code : Tout sélectionner

Structure BITMAPFILEHEADER
  bfType.w
  bfSize.l
  bfReserved1.w
  bfReserved2.w
  bfOffBits.l
EndStructure

Structure BITMAPINFOHEADER
  biSize.l
  biWidth.l
  biHeight.l
  biPlanes.w
  biBitCount.w
  biCompression.l
  biSizeImage.l
  biXPelsPerMeter.l
  biYPelsPerMeter.l
  biClrUsed.l
  biClrImportant.l
EndStructure

Structure BITMAPINFO2
  bmiHeader.BITMAPINFOHEADER
  bmiColors.RGBQUAD[0]
EndStructure
Dri

Publié : sam. 27/janv./2007 15:54
par cha0s
tmyke a écrit :T'as pas de soucis avec les bmp 'tout fait', ou exportés avec un prog de dessin ?
non.
j'ai reperé une fonction "D3DXSaveTextureToFileInMemory" quand j'aurai le temp je ferait une petite analyse de la zone memoire qu'elle me retourne.

Publié : dim. 28/janv./2007 15:10
par cha0s
on dirait que les fonctions de directX ne m'aime pas :s

Code : Tout sélectionner

Global  *ppBuffer.ID3DXBUFFER
D3DXCreateBuffer(70, *ppBuffer)
sa compile sa se lance mais D3DXCreateBuffer renvoie une erreur

Publié : dim. 28/janv./2007 16:04
par tmyke
Perso, j'ecrirait en fait:

Code : Tout sélectionner

Global  *ppBuffer.ID3DXBUFFER
D3DXCreateBuffer(70, @*ppBuffer)  
la doc dit bien :
Address of a pointer to an ID3DXBuffer interface,...
:wink:

Publié : dim. 28/janv./2007 16:30
par cha0s
tmyke a écrit :Perso, j'ecrirait en fait:

Code : Tout sélectionner

Global  *ppBuffer.ID3DXBUFFER
D3DXCreateBuffer(70, @*ppBuffer)  
la doc dit bien :
Address of a pointer to an ID3DXBuffer interface,...
:wink:

*love*

D3DXCreateTextureFromFileInMemory ne marchait pas pour la meme raison. :p