Dans les grandes lignes.
■ Mise en œuvre d'une base de données dont chaque enregistrement est composé du nom d'une image et du contenu de l'image.
Code : Tout sélectionner
; Creation d'une table de test
ReqSql = "CREATE TABLE test ("
ReqSql + "idauto INTEGER PRIMARY KEY," ;Identification auto
ReqSql + "filename TEXTE," ;Nom
ReqSql + "image BLOB" ;Image
ReqSql + ");"
Code : Tout sélectionner
;
; Ajout dans la base de données
ReqSql = "insert into test (fileName, image) values (?,?)"
SetDatabaseString (#DataBase, 0, GetFilePart(FileName))
SetDatabaseBlob (#DataBase, 1, *Buffer, MemorySize(*Buffer))
DatabaseUpdate(#Database, ReqSql)
Code : Tout sélectionner
fileName = GetDatabaseString(#DataBase, 0)
blobSize = DatabaseColumnSize(#Database, 1) ; Obtenir la taille du BLOB
*buffer = AllocateMemory(blobSize) ; Allouer une zone mémoire
result = GetDatabaseBlob(#Database, 1, *buffer, blobsize)
If Result
Image = CatchImage(#PB_Any, *Buffer, blobSize)
EndIf
Code : Tout sélectionner
EnableExplicit
Enumeration window
#mf
EndEnumeration
Enumeration gadget
#mfSelect
#mfShow
EndEnumeration
Enumeration misc
#Database
#ImageFile
EndEnumeration
;Sommaire
Declare InitDB()
Declare Start()
Declare SelectMedia()
Declare DatabaseShow()
Declare Exit()
UseSQLiteDatabase()
UseJPEGImageEncoder()
UseJPEGImageDecoder()
UsePNGImageEncoder()
UsePNGImageDecoder()
InitDB()
Start()
Procedure InitDB()
Protected ReqSql.S
;Ouverture et création de la base de données en mémoire
OpenDatabase(#DataBase, ":memory:", "", "")
; Creation d'une table de test
ReqSql = "CREATE TABLE test ("
ReqSql + "idauto INTEGER PRIMARY KEY," ;Identification auto
ReqSql + "filename TEXTE," ;Nom
ReqSql + "image BLOB" ;Image
ReqSql + ");"
DatabaseUpdate(#DataBase, ReqSql)
EndProcedure
Procedure Start()
OpenWindow(#mf, 0, 0, 800, 600, "Images dans une base de donnée", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ButtonGadget(#mfSelect, 20, 20, 150, 24, "Selectionner une image")
ButtonGadget(#mfShow, 20, 50, 150, 24, "Voir toutes les images")
; Déclencheurs
BindGadgetEvent(#mfSelect, @SelectMedia())
BindGadgetEvent(#mfShow, @databaseShow())
BindEvent(#PB_Event_CloseWindow, @Exit())
; Loop
Repeat : WaitWindowEvent(1000) : ForEver
EndProcedure
;Selection d'une image
Procedure SelectMedia()
Protected ReqSql.s
Protected Pattern.s = "Image Files (*.bmp, *.jpg, *.png)|*.bmp;*.jpg;*.png"
Protected FileName.s = OpenFileRequester("Sélectionner une image", "", Pattern, 0)
Protected *buffer, length
If FileName <> ""
; Lecture de l'imafge
If ReadFile(#ImageFile, FileName)
length = Lof(#ImageFile)
*buffer = AllocateMemory(length)
ReadData(#ImageFile, *buffer, length)
CloseFile(#ImageFile)
; Ajout dans la base de donnée
ReqSql = "insert into test (fileName, image) values (?,?)"
SetDatabaseString (#DataBase, 0, GetFilePart(FileName))
SetDatabaseBlob (#DataBase, 1, *Buffer, MemorySize(*Buffer))
DatabaseUpdate(#Database, ReqSql)
; Libérer la zone mémoire
FreeMemory(*buffer)
EndIf
EndIf
EndProcedure
Procedure DatabaseShow()
Protected window
Protected fileName.s, *buffer, blobSize, image, result
DatabaseQuery(#DataBase, "SELECT fileName, image FROM test")
While NextDatabaseRow(#Database)
; Obtenir nom de l'image. Colonne 0 (c'est facile)
fileName = GetDatabaseString(#DataBase, 0)
; Obtenir contenu de l'image. Colonne 1 (Un peu plus compliqué)
blobSize = DatabaseColumnSize(#Database, 1) ; Obtenir la taille du BLOB
*buffer = AllocateMemory(blobSize) ; Allouer une zone mémoire
result = GetDatabaseBlob(#Database, 1, *buffer, blobsize)
; Voir le résultat
If Result
Image = CatchImage(#PB_Any, *Buffer, blobSize)
Window = OpenWindow(#PB_Any, 0, 0, ImageWidth(image), ImageHeight(image), filename, #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_TitleBar)
ImageGadget(#PB_Any, 0, 0, 0, 0, ImageID(image))
StickyWindow(window, #True)
EndIf
Wend
EndProcedure
Procedure Exit()
Protected window = EventWindow()
If window <> #mf
CloseWindow(window)
Else
End
EndIf
EndProcedure