Page 1 of 1
Saving image to file
Posted: Mon Feb 25, 2019 5:24 am
by kpeters58
Given an imagegadget with an image loaded, how can I save that image to file?
I see that I can get ImageFormat(), ImageWidth(), ImageHeight() and ImageId() but how can I get the imagedata and save it?
Re: Saving image to file
Posted: Mon Feb 25, 2019 6:07 am
by Bisonte
You can do it with a little trick.
Take the Image ID with GetGadgetState() and create a new image with the
Dimensions of the ImageGadget. Then draw the image by ID on the one you just created and save it.
This "workaround" should be crossplatform.
Code: Select all
#Win = 0
#ImageGadget = 1
#ButtonGadget = 2
OpenWindow(#Win, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ImageGadget(#ImageGadget, 10, 10, 200, 200, LoadImage(1, #PB_Compiler_Home + "Examples\Sources\Data\Purebasic.bmp"))
ButtonGadget(#ButtonGadget, 1, 250, 100, 20,"GO")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #ButtonGadget
ID = GetGadgetState(#ImageGadget)
ImageToSave = CreateImage(#PB_Any, GadgetWidth(#ImageGadget), GadgetHeight(#ImageGadget))
If IsImage(ImageToSave)
If StartDrawing(ImageOutput(ImageToSave))
DrawImage(ID, 0, 0)
StopDrawing()
EndIf
SaveImage(ImageToSave, "D:\Image.bmp")
Debug "Saved"
EndIf
EndSelect
EndSelect
ForEver
Re: Saving image to file
Posted: Mon Feb 25, 2019 6:23 am
by Olliv
Normally, one image has three places to be stored in a computer : as a file, compressed or not, in a mass storage.
As a buffer, swapped or not, in RAM.
As a texture, in VIDEO RAM.
LoadImage() expects a image file fullname. And returns an ID.
Code: Select all
ID = LoadImage(#Pb_Any, ImageFileName)
With ImageOutput() which expects a image number, we can create a draw process.
Code: Select all
If StartDrawing(ImageOutput(ID) )
; draw process...
StopDrawing()
EndIf
Inside this draw process, we can ask any characteristics of the current ID image.
Code: Select all
Structure Coloring
R.b
G.b
B.b
A.b
EndStructure
Structure Pixel
Pix.Coloring
EndStructure
; draw process
*Buffer.Pixel = DrawingBuffer()
To record a new file image just use SaveImage().
Re: Saving image to file
Posted: Mon Feb 25, 2019 7:06 am
by RASHAD
Tested with Windows 10 x64
Code: Select all
#Win = 0
#ImageGadget = 1
#ButtonGadget = 2
;Get Image from ImagID by Danilo
Import ""
PB_Object_EnumerateAll(*object,*callback,*d)
PB_Object_EnumerateStart(*object)
PB_Object_EnumerateNext(*object,*id.Integer)
PB_Object_EnumerateAbort(*object)
PB_Object_Count(*object)
EndImport
Procedure ImageFromImageID(ImageID)
Protected id, Image_Objects, result = -1
CompilerIf #PB_Compiler_Processor = #PB_Processor_x64
!extrn PB_Image_Objects
!PUSH qword [PB_Image_Objects]
!POP qword [p.v_Image_Objects]
CompilerElse
!extrn _PB_Image_Objects
!PUSH dword [_PB_Image_Objects]
!POP dword [p.v_Image_Objects]
CompilerEndIf
PB_Object_EnumerateStart(Image_Objects)
While PB_Object_EnumerateNext(Image_Objects,@id)
If ImageID = ImageID(id)
result = id
PB_Object_EnumerateAbort(Image_Objects)
Break
EndIf
Wend
ProcedureReturn result
EndProcedure
OpenWindow(#Win, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
img = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\Purebasic.bmp")
ImageGadget(#ImageGadget, 10, 10, 200, 200,ImageID(img))
ButtonGadget(#ButtonGadget, 1, 250, 100, 20,"GO")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #ButtonGadget
ID = GetGadgetState(#ImageGadget)
pbimg = ImageFromImageID(ID)
SaveImage(pbimg,"d:\image.bmp")
EndSelect
EndSelect
ForEver
Re: Saving image to file
Posted: Mon Feb 25, 2019 8:24 am
by Dude
kpeters58 wrote:Given an imagegadget with an image loaded, how can I save that image to file?
I don't get the question. An ImageGadget() holds an image that you gave it... thus you already have the image. So, SaveImage()?
Re: Saving image to file
Posted: Mon Feb 25, 2019 9:06 am
by Bisonte
Dude wrote:An ImageGadget() holds an image that you gave it... thus you already have the image. So, SaveImage()?
Sometimes you only have an ImageID (Os-Handle).
Re: Saving image to file
Posted: Mon Feb 25, 2019 6:02 pm
by kpeters58
Thanks much for everone's help.
@Dude: That's easy. I have just read it from a blob in my database and the original image that got loaded into the database is long gone ...
Re: Saving image to file
Posted: Mon Feb 25, 2019 6:23 pm
by Papala
I have just read it from a blob in my database and the original image that got loaded into the database is long gone ...
Then why don't just getdatabaseblob => createfile => writedata ?
Re: Saving image to file
Posted: Mon Feb 25, 2019 8:43 pm
by mk-soft
@RASHAD
You can direct import PB_XXX_Objects...
Code: Select all
#Win = 0
#ImageGadget = 1
#ButtonGadget = 2
;Get Image from ImagID by Danilo
; Update mk-soft
; Force Import Fonts
Global __Dummy = LoadFont(#PB_Any, "", 11) : FreeFont(__Dummy)
CompilerIf #PB_Compiler_OS = #PB_OS_Windows
Import ""
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_GetObject( PB_Object , DynamicOrArrayID)
PB_Window_Objects.i
PB_Gadget_Objects.i
PB_Image_Objects.i
PB_Font_Objects.i
EndImport
CompilerElse
ImportC ""
PB_Object_EnumerateStart( PB_Objects )
PB_Object_EnumerateNext( PB_Objects, *ID.Integer )
PB_Object_EnumerateAbort( PB_Objects )
PB_Object_GetObject( PB_Object , DynamicOrArrayID)
PB_Window_Objects.i
PB_Gadget_Objects.i
PB_Image_Objects.i
PB_Font_Objects.i
EndImport
CompilerEndIf
Procedure ImageFromImageID(ImageID)
PB_Object_EnumerateStart(PB_Image_Objects)
While PB_Object_EnumerateNext(PB_Image_Objects,@id)
If ImageID = ImageID(id)
result = id
PB_Object_EnumerateAbort(PB_Image_Objects)
Break
EndIf
Wend
ProcedureReturn result
EndProcedure
OpenWindow(#Win, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
img = LoadImage(#PB_Any, #PB_Compiler_Home + "examples/sources/Data/PureBasic.bmp")
;img = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples\Sources\Data\Purebasic.bmp")
ImageGadget(#ImageGadget, 10, 10, 200, 200,ImageID(img))
ButtonGadget(#ButtonGadget, 1, 250, 100, 20,"GO")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #ButtonGadget
ID = GetGadgetState(#ImageGadget)
pbimg = ImageFromImageID(ID)
SaveImage(pbimg,SaveFileRequester("Save", "", "*.bmp", 0))
EndSelect
EndSelect
ForEver
Re: Saving image to file
Posted: Tue Feb 26, 2019 5:35 pm
by kpeters58
Papala wrote:I have just read it from a blob in my database and the original image that got loaded into the database is long gone ...
Then why don't just getdatabaseblob => createfile => writedata ?
Because that's a very expensive operation (database server roundtrip etc.). I have the image locally and my users are looking at it when they decide to export it.
Re: Saving image to file
Posted: Tue Feb 26, 2019 10:19 pm
by Dude
kpeters58 wrote:@Dude: That's easy. I have just read it from a blob in my database and the original image that got loaded into the database is long gone ...
I'm still not getting it. LoadImage(#FromBlob) from the database, set it to the gadget, and the image is still in #FromBlob until you free it (even if the database no longer holds it). What am I missing? Just because the database loses the image doesn't mean #FromBlob also loses it. It's still there for SaveImage(#FromBlob), etc.