Base64DecoderBuffer funktioniert nicht mehr

Für allgemeine Fragen zur Programmierung mit PureBasic.
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Base64DecoderBuffer funktioniert nicht mehr

Beitrag von stevie1401 »

Ich sende mit Spiderbasic ein Image in Base64 an Purebasic:

Spidercode:

Code: Alles auswählen

BildStr.s = EncodeImage(Bild)
Ich empfange den Code mit Purebasic und versuche den String in ein Bild umzuwandeln:

Code: Alles auswählen


 f=FindString(BildStr,"base64,")
  If f>0
    BildStr=Right(BildStr,Len(BildStr)-f-6)
  EndIf
  
  Debug BildStr
  
  bild=DecodeStringToImage(BildStr)  ;Aus dem BildString wieder ein Image machen

Procedure DecodeStringToImage(String.s)
  Protected *Buffer, L, *StringAscii,image
  
  *StringAscii = Ascii(String)
  *Buffer = AllocateMemory(99999) ;StringByteLength(String) ist Blödsinn.
  Base64DecoderBuffer(*StringAscii, MemorySize(*Buffer), *Buffer, MemorySize(*Buffer))
  ;FreeMemory(*StringAscii)
  
  image= CatchImage(#PB_Any, *Buffer)
  ;FreeMemory(*Buffer)
  ProcedureReturn Image
  ;   Debug string
EndProcedure

Aber ich bekomme immer einen Speicherzugriffsfehler.

Es hat aber mal funktioniert.
Hat sich bei Purebasic irgendetwas geändert?
Oder mache ich etwas falsch?
Zuletzt geändert von stevie1401 am 28.02.2021 13:21, insgesamt 1-mal geändert.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von STARGÅTE »

Gibt es einen Grund für diese 99999 als Größenangabe?
Du solltest beim dekodieren ja mindestens die Größe des Eingangspuffers reservieren.
Außerdem ist die erste Längenangabe quatsch, MemorySize(*Buffer) sollte MemorySize(*StringAscii) sein

Vielleicht solltest du auch zu Base64Decoder() wechseln, dort übergibst du direkt den String.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von stevie1401 »

Base64Decoder() kenne ich nicht


Ersetzt das die Procedure DecodeStringToImage(String.s) ?

Kannst du mir dafür ein Beispiel geben?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von Kiffi »

stevie1401 hat geschrieben:Kannst du mir dafür ein Beispiel geben?
ein Blick in die Hilfe kann nicht schaden: Base64Decoder()
Hygge
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von STARGÅTE »

So zum Beispiel:

Code: Alles auswählen

Procedure.i DecodeStringToImage(String.s)
	Protected Image.i, Length.i, *Buffer = AllocateMemory(Len(String)+64) ; Puffergröße muss min. 64 Byte sein.
	Length = Base64Decoder(String, *Buffer, MemorySize(*Buffer))
	Image = CatchImage(#PB_Any, *Buffer, Length)
	FreeMemory(*Buffer)
	ProcedureReturn Image
EndProcedure
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von stevie1401 »

Ich habe in die Hilfe geschaut, Kiffi. Und habe sie nicht verstanden. Deshalb frage ich im Forum nach. Du musst ja nicht antworten, wenn es dir zu blöde erscheint. Ich bin nun einmal ein Hobby-Programmierer und mehr nicht.

Stargate, deine Procedure bringt leider kein Bild hervor.

Wenn ich den Befehl Saveimage verwende, kommt folgende Meldung:

Code: Alles auswählen

 
i=SaveImage(Bild,ImageFile,#PB_ImagePlugin_JPEG)

[15:09:30] [ERROR] Das angegebene #Image ist nicht initialisiert.
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
Kiffi
Beiträge: 10621
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von Kiffi »

stevie1401 hat geschrieben:Ich habe in die Hilfe geschaut, Kiffi. Und habe sie nicht verstanden.
das ging aus Deiner Anfrage nicht hervor. Du hast nach einem Beispiel gefragt und ich habe ein Beispiel geliefert.
Hygge
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von STARGÅTE »

Da du ja kein kompletten Code gepostet hast, weiß ich nicht ob vielleicht schon an einer anderen Stelle was falsch war, die Codierung des Bilds oder Ähnliches. Zum Beispiel erzeugt "BildStr.s = EncodeImage(Bild)" aus deiner Eingangsfrage kein String, sondern ein Buffer. (Außer das ist in Spiderbasic anders, weiß ich gerade nicht).

Auf jeden Fall hier mal ein Kompletter Code mit Codierung und Decodierung:

Code: Alles auswählen

Enumeration
	#Window
	#Gadget1
	#Gadget2
EndEnumeration

; Encoder und Decoder inizialisieren
UsePNGImageDecoder()
UsePNGImageEncoder()

; Irgendein Bild erstellen
Define OriginalImage = CreateImage(#PB_Any, 200, 200)
If StartDrawing(ImageOutput(OriginalImage))
	Box(0, 0, 100, 100, $FF0000)
	Box(100, 0, 100, 100, $00FF00)
	Box(0, 100, 100, 100, $0000FF)
	Box(100, 100, 100, 100, $00FFFF)
	StopDrawing()
EndIf

; Bild als PNG und Base64 codieren
Define *Buffer, Base64String.s
*Buffer        = EncodeImage(OriginalImage, #PB_ImagePlugin_PNG)
Base64String.s = Base64Encoder(*Buffer, MemorySize(*Buffer))
FreeMemory(*Buffer)
Debug Base64String ; Base64 code angucken

; Base64 decodieren und als Bild laden
Define Length.i, DecodedImage.i
*Buffer      = AllocateMemory(Len(Base64String)+64) ; Laut Hilfe muss der Buffer mindestens 64 Byte haben, daher lieber +64
Length       = Base64Decoder(Base64String, *Buffer, MemorySize(*Buffer))
DecodedImage = CatchImage(#PB_Any, *Buffer, Length)
FreeMemory(*Buffer)

; Bilder Vergleichen
OpenWindow(#Window, 0, 0, 400, 200, "Base 64 image encoding and decoding", #PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#Gadget1, 0, 0, 200, 200, ImageID(OriginalImage))
ImageGadget(#Gadget2, 200, 0, 200, 200, ImageID(DecodedImage))

Repeat
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			Break
	EndSelect
ForEver

End
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Base64DecoderBuffer funktioniert nicht mehr

Beitrag von stevie1401 »

Das Beispiel funktioniert tadellos.
Danke!
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Antworten