Seite 1 von 1

Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 10:49
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?

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 12:15
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.

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 13:23
von stevie1401
Base64Decoder() kenne ich nicht


Ersetzt das die Procedure DecodeStringToImage(String.s) ?

Kannst du mir dafür ein Beispiel geben?

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 13:26
von Kiffi
stevie1401 hat geschrieben:Kannst du mir dafür ein Beispiel geben?
ein Blick in die Hilfe kann nicht schaden: Base64Decoder()

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 13:30
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

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 16:15
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.

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 16:30
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.

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 16:34
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

Re: Base64DecoderBuffer funktioniert nicht mehr

Verfasst: 28.02.2021 16:47
von stevie1401
Das Beispiel funktioniert tadellos.
Danke!