Image Size and SAVEIMAGE Problem [Resolved]

Just starting out? Need help? Post your questions and find answers here.
User avatar
tikidays
User
User
Posts: 46
Joined: Tue Oct 24, 2023 6:47 am
Location: New Zealand
Contact:

Re: Image Size and SAVEIMAGE Problem

Post by tikidays »

I stripped out my code to a smaller app to work on this problem, if some could help me fix the decode issue please that would be appreciated.

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

normeus
Enthusiast
Enthusiast
Posts: 475
Joined: Fri Apr 20, 2012 8:09 pm
Contact:

Re: Image Size and SAVEIMAGE Problem

Post by normeus »

Use enableExplicit and also around line 76. ( I didn't read the whole question but the error I get is because of not using a pointer )

Code: Select all

  Procedure.s encodeToString()
    Protected *buffer,encoded.s
  If loadedPNG = #Null : SetGadgetText(#messages, "Error, sourceImage is empty.") : ProcedureReturn : EndIf
  *buffer = EncodeImage(loadedPNG,#PB_ImagePlugin_PNG)
  size = MemorySize(*buffer)
  encoded.s = Base64Encoder(*buffer, size) ; <-------------------------------- this line
  SetGadgetText(#messages, "Encoded:" + Left(encoded,50)+"...")
  FreeMemory(*buffer)
  ProcedureReturn encoded
EndProcedure

Norm.
google Translate;Makes my jokes fall flat- Fait mes blagues tombent à plat- Machte meine Witze verpuffen- Eh cumpari ci vo sunari
User avatar
Demivec
Addict
Addict
Posts: 4282
Joined: Mon Jul 25, 2005 3:51 pm
Location: Utah, USA

Re: Image Size and SAVEIMAGE Problem

Post by Demivec »

Unrelated to your original question, a minor code issue jumps out:

Code: Select all

;Comparison should be changed to <> #Null
If loadedPNG > #Null : SetGadgetText(#processImage, "Encode"): EndIf
;...snipped
;ID results returned from using #PB_Any could be interpreted as being < 0 (or #NULL)
loadedPNG = LoadImage(#PB_Any,file)
pjay
Enthusiast
Enthusiast
Posts: 277
Joined: Thu Mar 30, 2006 11:14 am

Re: Image Size and SAVEIMAGE Problem

Post by pjay »

As normeus said:

Code: Select all

  *buffer = EncodeImage(loadedPNG,#PB_ImagePlugin_PNG)
  size = MemorySize(*buffer)
  encoded.s = Base64Encoder(loadedPNG, size)
Should be:

Code: Select all

  *buffer = EncodeImage(loadedPNG,#PB_ImagePlugin_PNG)
  size = MemorySize(*buffer)
  encoded.s = Base64Encoder(*buffer, size)
and:

Code: Select all

            Case "Decode"
              loadedPNG = decodeFromString(sourceString)
              SetGadgetState(#viewImage,loadedPNG)
shoyuld be:

Code: Select all

            Case "Decode"
              loadedPNG = decodeFromString(sourceString)
              SetGadgetState(#viewImage,ImageID(loadedPNG))
User avatar
tikidays
User
User
Posts: 46
Joined: Tue Oct 24, 2023 6:47 am
Location: New Zealand
Contact:

Re: Image Size and SAVEIMAGE Problem

Post by tikidays »

Solved! thanks so much to you all, I had just made the break through my self with the advise above with the following code for those interested, using a pre-coded image to be sure this wasn't the source of my problems, I think it was the Memory pointer being used to get the size that fixed it.

Code: Select all

UsePNGImageDecoder()
UsePNGImageEncoder()
base64.s = "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"
size = StringByteLength(base64) * 1.35 : If size < 64 : size = 64 :EndIf
*buffer = AllocateMemory(size)
Base64Decoder(base64,*buffer,MemorySize(*buffer))
image = CatchImage(#PB_Any,*buffer) 
OpenWindow(0,0,0,200,200,"Decoded Image", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ImageGadget(2,0,0,200,200,ImageID(image))
Repeat
  event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow
Post Reply