Page 1 sur 1
Adresse mémoire et taille d'une image [Resolu]
Publié : ven. 17/juin/2011 21:07
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.
Re: Adresse mémoire et taille d'une image
Publié : ven. 17/juin/2011 21:16
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 ?
Re: Adresse mémoire et taille d'une image
Publié : ven. 17/juin/2011 21:25
par fd
L'adresse mémoire du fichier et en second paramètre la taille du fichier
Re: Adresse mémoire et taille d'une image
Publié : ven. 17/juin/2011 21:49
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.
Re: Adresse mémoire et taille d'une image
Publié : ven. 17/juin/2011 23:45
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

)
Re: Adresse mémoire et taille d'une image
Publié : sam. 18/juin/2011 9:54
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.
Re: Adresse mémoire et taille d'une image
Publié : sam. 18/juin/2011 12:37
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.
Re: Adresse mémoire et taille d'une image
Publié : sam. 18/juin/2011 13:45
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
Re: Adresse mémoire et taille d'une image
Publié : sam. 18/juin/2011 14:43
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
Re: Adresse mémoire et taille d'une image [Resolu]
Publié : sam. 18/juin/2011 16:31
par G-Rom
Merci, ça marche. En fait, j'ai supprimé tout les * et cela fonctionne !

aucun rapport a mon avis , plutôt une erreur de syntaxe de ta part.