Code: Select all
;
; PNG to String to PNG encoder.
;
UsePNGImageEncoder()
UsePNGImageDecoder()
Enumeration
#processImage
#viewImage
#mainWindow
#messages
#toolbar
#toolbarHeight = 51
#gap = 3
EndEnumeration
Declare decodeFromString(sourceBase64.s)
Declare.s encodeToString()
Global file.s,
loadedPNG,
size.i,
image.l,
sourceString.s,
width.i = 1024,
height.i = 1024
OpenWindow(#mainWindow,0,0,width,height+#toolbarHeight,"Image Viewer", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(#viewImage,1,0,width,height,#Null)
ContainerGadget(#toolbar, 0, height, width,#toolbarHeight) : SetGadgetColor(#toolbar,#PB_Gadget_BackColor,RGB(128,128,128))
TextGadget(#messages,0,#gap,width,20,"PNG Encoder and Decoder, open a PNG File.", #PB_Text_Center)
ButtonGadget(#processImage,width/2-100, GadgetHeight(#messages)+#gap, 200,25,"Open",#PB_Button_Default)
CloseGadgetList()
Repeat
If sourceString = #Null$ And loadedPNG = #Null: SetGadgetText(#processImage, "Open") : EndIf
If sourceString > #Null$ : SetGadgetText(#processImage, "Decode"): EndIf
If loadedPNG > #Null : SetGadgetText(#processImage, "Encode"): EndIf
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
CloseWindow(#mainWindow)
End
Case #PB_Event_Gadget
Select EventGadget()
Case #processImage
Select GetGadgetText(#processImage)
Case "Encode"
sourceString = encodeToString()
SetGadgetState(#viewImage,#Null)
loadedPNG = #Null
Case "Decode"
loadedPNG = decodeFromString(sourceString)
SetGadgetState(#viewImage,loadedPNG)
Case "Open"
sourceString = #Null$ : loadedPNG = #Null
SetGadgetState(#viewImage,#Null)
file = OpenFileRequester("Select a PNG file...",GetUserDirectory(#PB_Directory_Pictures),"PNG (*.png)",0)
size = FileSize(file)
If size > 0
loadedPNG = LoadImage(#PB_Any,file)
SetGadgetState(#viewImage,ImageID(loadedPNG))
SetGadgetText(#messages, "PNG:"+file)
EndIf
EndSelect
EndSelect
EndSelect
ForEver
Procedure.s encodeToString()
If loadedPNG = #Null : SetGadgetText(#messages, "Error, sourceImage is empty.") : ProcedureReturn : EndIf
*buffer = EncodeImage(loadedPNG,#PB_ImagePlugin_PNG)
size = MemorySize(*buffer)
encoded.s = Base64Encoder(loadedPNG, size)
SetGadgetText(#messages, "Encoded:" + Left(encoded,50)+"...")
FreeMemory(*buffer)
ProcedureReturn encoded
EndProcedure
Procedure decodeFromString(sourceBase64.s)
SetGadgetText(#messages, "Decoding:" + Left(sourceBase64,50)+"...")
*buffer = AllocateMemory(size)
If *buffer
If imageSize = Base64Decoder(sourceBase64,*buffer,size)
image = CatchImage(#PB_Any, *buffer,imageSize)
FreeMemory(*buffer)
ProcedureReturn image
Else
SetGadgetText(#messages,"Decode failed. imageSize:"+Str(imageSize/1024)+"kb sourceBase64:"+ Left(sourceBase64,10)+"... *buffer:"+Str(*buffer) + " size:"+Str(size/1024)+"kb")
sourceString = #Null$ : loadedPNG = #Null
EndIf
Else
SetGadgetText(#messages,"*buffer: Decode failed.sourceBase64:"+ Left(sourceBase64,10)+"... *buffer:"+Str(*buffer) + " size:"+Str(size/1024)+"kb")
sourceString = #Null$ : loadedPNG = #Null
EndIf
FreeMemory(*buffer)
EndProcedure


