Base64 in SQLite als BLOB

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Base64 in SQLite als BLOB

Beitrag von Velindos »

Hallo Leute,
möchte ein base64 codiertes Bild in die SQLITE schreiben und lesen mit Base64EncoderBuffer/Base64DecoderBuffer als BLOB, geht aber nicht!
Kann jemand sagen warum!

Code: Alles auswählen

Global DDBASE.s = "D:\Dokumente\Temp\Base64Test.db"
Global FL=2
Global Bildspalte = 1

Global *ImageMemory
Global ImageMemSize

Global *Base64Memory
Global Base64MemSize

Global Base64_String$
Global Base64_Re_String$ 

Enumeration 
  #DB
  #DB_Img
EndEnumeration

UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()

UseSQLiteDatabase()

Pattern$ = "Image Files (*.bmp, *.jpg, *.png, *.tif)|*.bmp;*.jpg;*.png;*.tif" 
imagefile$ = OpenFileRequester("Choose an image file", "", pattern$, 0) 

If ReadFile(FL, imagefile$)
  *ImageMemory = AllocateMemory(Lof(FL))
  ReadData(FL, *ImageMemory, Lof(FL))
  ; ---------------
  Base64MemSize = Base64EncoderBuffer(*ImageMemory, MemorySize(*ImageMemory), *Base64Memory,MemorySize(*ImageMemory))

  
  ; ---------------
  CloseFile(FL)
EndIf
;{
If FileSize(DDBASE) <> -1
  DeleteFile(DDBASE)
EndIf
;}
;{
If FileSize(DDBASE)=-1
  If CreateFile(FL, DDBASE)
    CloseFile(FL)
  EndIf
EndIf
;}
;{ Now open it and save the values, close it up
OpenDatabase(#DB, DDBASE,#Null$,#Null$)
DatabaseUpdate(#DB, "CREATE TABLE Velindos (Pfad TEXT, myBild BLOB)")
; SetDatabaseBlob(#DB, 0, *ImageMemory, MemorySize(*ImageMemory))
SetDatabaseBlob(#DB, 0, *Base64Memory, Base64MemSize)
DatabaseUpdate(#DB, "INSERT INTO Velindos (Pfad, myBild) VALUES ('" + imagefile$ + "',?)") 
CloseDatabase(#DB)
FreeMemory(*Base64Memory)
;}
;{ Now open up the database and read the image and Pfad from it
If OpenDatabase(#DB, DDBASE,#Null$,#Null$)  
  DatabaseQuery(#DB, "SELECT * FROM Velindos")
  FirstDatabaseRow(#DB)
  imagefile$ = GetDatabaseString(#DB,0)
  Base64MemSize = DatabaseColumnSize(#DB, 1)
  *Base64Memory = AllocateMemory(Base64MemSize)
  GetDatabaseBlob(#DB, 1, *Base64Memory, Base64MemSize)
  CloseDatabase(#DB)  
EndIf 
;}
;{
ImageMemSize = Base64DecoderBuffer(*Base64Memory, Base64MemSize,*ImageMemory,Base64MemSize)

CatchImage(#DB_Img, *ImageMemory, @ImageMemSize)


;}
OpenWindow(0,0,0,ImageWidth(#DB_Img),ImageHeight(#DB_Img),imagefile$,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(0,0,0,0,0,ImageID(#DB_Img))
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Base64 in SQLite als BLOB

Beitrag von NicTheQuick »

Du nutzt Base64EncoderBuffer() falsch. Der Ausgangspuffer muss bereits alloziert sein und am besten 35% größer sein als der Eingansgpuffer (siehe Hilfe). Hintergrund ist, dass für jedes Byte (2^8) nur noch 6 Bit zur Verfügung stehen. Das bedeutet n Bytes verbrauchen später 8/6n Bytes oder eben 33,33% mehr.
Bild
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Base64 in SQLite als BLOB

Beitrag von Kiffi »

@Velindos: Es ist unnötig, Dein Image in einen Base64-String zu konvertieren, wenn Du es ohnehin in ein BLOB-Feld speicherst.
Hygge
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Base64 in SQLite als BLOB

Beitrag von Velindos »

hallo Leute!

Danke, hab die Sache wie folgt eingefügt:

Code: Alles auswählen

; Image IN/OUT Database per BASE64

Global DDBASE.s = "D:\Dokumente\Temp\Base64Test.db"
Global FL=2
Global Bildspalte = 1

Global *ImageMemory
Global ImageMemSize

Global *Base64Memory
Global Base64MemSize

Global Base64_String$
Global Base64_Re_String$ 

Enumeration 
  #DB
  #DB_Img
EndEnumeration

UsePNGImageDecoder()
UseJPEGImageDecoder()
UseTIFFImageDecoder()

UseSQLiteDatabase()

Pattern$ = "Image Files (*.bmp, *.jpg, *.png, *.tif)|*.bmp;*.jpg;*.png;*.tif" 
RequesterFile$ = OpenFileRequester("Choose an image file", "", pattern$, 0) 

If ReadFile(FL, RequesterFile$)
  *ImageMemory = AllocateMemory(Lof(FL))
  ReadData(FL, *ImageMemory, Lof(FL))
  ; ---------------
  Base64MemSize = MemorySize(*ImageMemory) * 1.35
  *Base64Memory = AllocateMemory(Base64MemSize)
  ; ---------------
  Base64MemSize = Base64EncoderBuffer(*ImageMemory, MemorySize(*ImageMemory), *Base64Memory, Base64MemSize)
  ; ---------------
  CloseFile(FL)
EndIf
;{
If FileSize(DDBASE) <> -1
  DeleteFile(DDBASE)
EndIf
;}
;{
If FileSize(DDBASE)=-1
  If CreateFile(FL, DDBASE)
    CloseFile(FL)
  EndIf
EndIf
;}
;{ Now open it and save the values, close it up
OpenDatabase(#DB, DDBASE,#Null$,#Null$)
DatabaseUpdate(#DB, "CREATE TABLE Velindos (Pfad TEXT, myBild BLOB)")
; SetDatabaseBlob(#DB, 0, *ImageMemory, MemorySize(*ImageMemory))
SetDatabaseBlob(#DB, 0, *Base64Memory, Base64MemSize)
DatabaseUpdate(#DB, "INSERT INTO Velindos (Pfad, myBild) VALUES ('" + RequesterFile$ + "',?)") 
CloseDatabase(#DB)
FreeMemory(*Base64Memory)
;}
;{ Now open up the database and read the image and Pfad from it
If OpenDatabase(#DB, DDBASE,#Null$,#Null$)  
  DatabaseQuery(#DB, "SELECT * FROM Velindos")
  FirstDatabaseRow(#DB)
  RequesterFile$ = GetDatabaseString(#DB,0)
  Base64MemSize = DatabaseColumnSize(#DB, 1)
  *Base64Memory = AllocateMemory(Base64MemSize)
  GetDatabaseBlob(#DB, 1, *Base64Memory, Base64MemSize)
  CloseDatabase(#DB)  
EndIf 
;}
;{ Base64Decoder
; ---------------
*ImageMemory = AllocateMemory(Base64MemSize)
ImageMemSize = MemorySize(*ImageMemory)
; ---------------
Base64DecoderBuffer(*Base64Memory, Base64MemSize, *ImageMemory, ImageMemSize)
; ---------------
CatchImage(#DB_Img, *ImageMemory, @ImageMemSize)
; ---------------
;}
OpenWindow(0,0,0,ImageWidth(#DB_Img),ImageHeight(#DB_Img),RequesterFile$,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(0,0,0,0,0,ImageID(#DB_Img))
Repeat:Until WaitWindowEvent() = #PB_Event_CloseWindow
und läuft!
@ Kiffi : Möchte das Bild Vercoden! in der Base!

Gruss ... Velindos!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Base64 in SQLite als BLOB

Beitrag von Kiffi »

Velindos hat geschrieben: 24.08.2021 15:57@ Kiffi : Möchte das Bild Vercoden! in der Base!
ja gut, mach mal.
Hygge
Antworten