Adresse mémoire et taille d'une image [Resolu]

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Adresse mémoire et taille d'une image [Resolu]

Message par fd »

Bonjour,

Encore sur les images, désolé !
J'utilise la librairie pure_pdf pour gérer mes impressions. Pdf_image charge le fichier depuis le disque à chaque fois, or je stocke mon image dans une base sqlite.
Mon image (logo) est chargé depuis la base de données dans #Image_1 avec la fonction CatchImage(). Comment connaitre l'adresse de #Image_1 et sa taille en mémoire, pour pouvoir utiliser Pdf_ImageMem qui va chercher l'image en mémoire, mais il faut connaitre son adresse et sa taille !

Faut-il creuser une piste du style :
*pointeur = catchimage(#Image_1, *blobreadbuffer)
pdf_ImageMem("Logo", *pointeur, MemSize ???, X, Y , W , H)

Je ne trouve pas vraiment d'explication.

Merci.
Dernière modification par fd le sam. 18/juin/2011 14:44, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Adresse mémoire et taille d'une image

Message par G-Rom »

A tout hazard imageID(ID) ?
après tout dépend des paramètres de Pdf_ImageMem() , il prend quoi ? un tableau de pixel ? l'adresse mémoire du fichier ? la structure PB_Image ?
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Re: Adresse mémoire et taille d'une image

Message par fd »

L'adresse mémoire du fichier et en second paramètre la taille du fichier
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Adresse mémoire et taille d'une image

Message par G-Rom »

Dans ce cas , il te faut utiliser un buffer.
FileID = LoadFile(#pb_any,"monfichier.abc")
*Buffer = AllocateMemory(Lof(FileID))
ReadData(FileID, *Buffer, Lof(FileID))
*Buffer et ton pointeur sur ton fichier
MemorySize(*Buffer) la taille.
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Adresse mémoire et taille d'une image

Message par graph100 »

comme ce topic sied mon sujet :

@G-Rom : OK ;) mais comment faire si tu crée ton image avec CreateImage() ?? (Surtout ne pas passer par une écriture dans un fichier :lol: )
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Re: Adresse mémoire et taille d'une image

Message par fd »

Bonjour,

Je reprend ce matin ... L' #image_1 est correctement traitée par CatchImage et réutilisable dans la suite du programme. Par contre l'image en mémoire *logo n'existe plus dans la procédure suivante. Je ne mets pas de Freememory sur la valeur *logo ... mais elle vaut 0 dans la procédure pfdLogo et génère un plantage. Global *logo n'est pas compris par purebasic.
Bref, il doit rester un truc que je n'ai pas compris.

Code : Tout sélectionner

Procedure.l LireImage(Code.s)
DatabaseQuery(#Base_1,"SELECT Image FROM Images WHERE Code = '"+Code+"'") 
FirstDatabaseRow(#Base_1) 
tailleimage = DatabaseColumnSize(#Base_1,0) 
If tailleimage <> 0
  if code = "logo"
      *logo = AllocateMemory(tailleimage)
      GetDatabaseBlob(#Base_1, 0, *logo, tailleimage)
      CatchImage(#Image_1, *logo)      
  else
      *blobreadbuffer = AllocateMemory(tailleimage)
      GetDatabaseBlob(#Base_1, 0, *blobreadbuffer, tailleimage) 
      CatchImage(#Image_1, *blobreadbuffer)
      FreeMemory(*blobreadbuffer)
  endif
Else
  CopyImage(#Image_102,#Image_1)
EndIf 
FinishDatabaseQuery(#Base_1) 
ProcedureReturn #Image_1
EndProcedure 

Procedure.l PdfLogo(x.l,y.l,z.l,w.l)
pdf_ImageMem("FCPE", *logo,MemorySize(*logo),x,y,z,w)
EndProcedure
Merci de vos conseils.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Adresse mémoire et taille d'une image

Message par G-Rom »

Procedure.l PdfLogo(x.l,y.l,z.l,w.l)
pdf_ImageMem("FCPE", *logo,MemorySize(*logo),x,y,z,w)
EndProcedure
*Logo vaut quoi dans se scope ?
tu ne teste même pas si le pointeur est nul, met le en global, ou rajoute un paramètre.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Adresse mémoire et taille d'une image

Message par djes »

Tu n'as pas à passer par la bibliothèque image, ni à utiliser de catchimage().

La fonction pdf_ImageMem() attend un fichier tel qu'il est sur le disque, au format PNG ou JPEG, tu dois donc le lire et l'insérer dans ta base avec readfile() (je suppose que c'est ce que tu fais déjà).

Pareil pour l'image #Image_102, vers un espace mémoire, avec readfile()

Comme dit G-Rom, tu dois bien utiliser les allocatememory(), mais tu ne dois pas les libérer dans ta procédure, mais quand tu as passé l'image à #pdf_ImageMem(). Ta procédure LireImage() doit soit renvoyer le pointeur vers l'espace mémoire où il y a l'Image_102 (que tu charges au début ou au besoin), soit le pointeur vers l'espace mémoire où il y a l'image que tu sors de ta base de données (qui n'a pas besoin de commencer par * puisque tu n'utilises pas de structure)

Code : Tout sélectionner

Procedure DefaultImage()
 là tu charges ton image par défaut
EndProcedure

Procedure.l LireImage(Code.s)
  If DatabaseQuery(#Base_1,"SELECT Image FROM Images WHERE Code = '" + Code + "'") <> 0
    If FirstDatabaseRow(#Base_1) <> 0
      TailleImage = DatabaseColumnSize(#Base_1, 0) 
      If TailleImage <> 0
        ImageBuf = AllocateMemory(TailleImage)
        If ImageBuf <> 0
          If GetDatabaseBlob(#Base_1, 0, ImageBuf, TailleImage) <> 0
            ImageBuf = DefaultImage()
          EndIf
        Else
          ImageBuf = DefaultImage()
        EndIf  
      Else
          ImageBuf = DefaultImage()
      EndIf 
      FinishDatabaseQuery(#Base_1) 
    Else
      ImageBuf = DefaultImage()
    EndIf  
  Else
    ImageBuf = DefaultImage()
  EndIf
  
  ProcedureReturn ImageBuf
  
EndProcedure 


Procedure.l PdfLogo(x.l, y.l, z.l, w.l, ImageBuf) 
  pdf_ImageMem("FCPE", ImageBuf, MemorySize(ImageBuf), x, y, z, w)
  FreeMemory(ImageBuf)
EndProcedure
fd
Messages : 70
Inscription : mar. 15/mars/2005 21:41
Localisation : Savoie

Re: Adresse mémoire et taille d'une image

Message par fd »

Merci, ça marche. En fait, j'ai supprimé tout les * et cela fonctionne !

Pour répondre à djes, pdf_image attend un fichier sur disque : cela marche très bien, mais je chargeais le fichier depuis la base de données, l'enregistrais sur le disque local et le re-chargeais en image via pdf_image ... Mon but était donc de lire directement la plage mémoire pdf_imagemem sans passer par toutes les étapes précédentes. Je n'ai pas bien compris pourquoi mon buffer *logo peut être aussi une variable logo ... mais cela fonctionne en mettant la variable logo en global.

Code : Tout sélectionner

Global logo.l

Procedure.l LireImage(Code.s)
DatabaseQuery(#Base_1,"SELECT Image FROM Images WHERE Code = '"+Code+"'") 
FirstDatabaseRow(#Base_1) 
tailleimage = DatabaseColumnSize(#Base_1,0) 
If tailleimage <> 0
  Select Code
    Case "logo"
      logo = AllocateMemory(tailleimage)
      GetDatabaseBlob(#Base_1, 0, logo, tailleimage)
      CatchImage(#Image_1, logo)      
    Default
      *blobreadbuffer = AllocateMemory(tailleimage)
      GetDatabaseBlob(#Base_1, 0, *blobreadbuffer, tailleimage) 
      CatchImage(#Image_1, *blobreadbuffer)
      FreeMemory(*blobreadbuffer)
  EndSelect
Else
  CopyImage(#Image_102,#Image_1)
EndIf 
FinishDatabaseQuery(#Base_1) 
ProcedureReturn #Image_1
EndProcedure 

Procedure.l PdfLogo(x.l,y.l,z.l,w.l)
pdf_ImageMem("Logo", logo,MemorySize(logo),x,y,z,w)
EndProcedure  
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Adresse mémoire et taille d'une image [Resolu]

Message par G-Rom »

Merci, ça marche. En fait, j'ai supprimé tout les * et cela fonctionne !
8O aucun rapport a mon avis , plutôt une erreur de syntaxe de ta part.
Répondre