Encodage de données dans une image bmp

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Cool Dji
Messages : 1126
Inscription : ven. 05/sept./2008 11:42
Localisation : Besançon
Contact :

Encodage de données dans une image bmp

Message par Cool Dji »

Hello,

Pour le dernier PurePunch, j'avais encodé les données de mes mesh dans l'image en bmp.
En effet, mettre les data en datasection prenait trop de lignes et nous n'avions pas le droit à d'autres fichiers à part l'image et le fichier son...

Pour SpiderBasic, j'ai ressorti mon petit code car il semble que les DataSection et les loadFile ne soient pas activés et je n'ai pas envie de m'embeter avec des fichiers xml pour les données de MapEditor.
C'est pas optimisé, mais ça marche bien :D

1er code : enregistre les données (ici, les valeurs de nombre de 0 à 100) dans un fichier au format raw, que j'ouvre dans Photoshop et que j'enregistre en bmp...

Code : Tout sélectionner

CreateFile(0,"Data.raw")
For j=0 To 100
  nombre=j
  nombrec.s=Bin(Nombre)
If nombre>255
  n1.s=Right(nombrec,8)
  n2.s=Left(nombrec,Len(nombrec)-8)
Else
  n1.s=nombrec
  n2.s=""
EndIf


  WriteByte(0,0)
  WriteByte(0,Val("%"+n2))
  WriteByte(0,Val("%"+n1))
  
Next

CloseFile(0)
2eme code : j'ouvre l'image, je lis les couleurs des pixels qui contiennent les données

Code : Tout sélectionner


;--- Charge Decor
LoadImage(0,"MadFire/Images/Data.bmp")
  StartDrawing(ImageOutput(0))
    For j=0 To 100
      ri(0,0)   ; ici je commence la lecture à X=0 et y=0
      DataCode(j)=t
    Next
    StopDrawing()

Procedure ri(x.i,y.i)
   cl=Point(x,y)
   n0=Str(Red(cl))
   n1=Str(Green(cl))
   n2=Str(Blue(cl))
   sr=""
   w=Len(Bin(Val(n2)))
   If w<8
   For q=0 To 8-w-1
   sr=sr+"0"  
   Next
   EndIf
   si=Bin(Val(n1))+sr+Bin(Val(n2))
   t=Val("%"+si)
   If n0="1":t=-t:EndIf
   c+1
   ;If c=512:c=0:l+1:EndIf // ici, c'est le modulo de la largeur de l'image que j'enleve si j'en ai pas besoin
 EndProcedure
Only PureBasic makes it possible