Page 1 of 1
Image Gadget: GetGadgetState()
Posted: Sun Aug 05, 2012 5:34 am
by IdeasVacuum
From the Help: "ImageGadget(): returns the ImageID of the currently displayed image."
Does not work for me (PB 4.61, Win XPx86).
MyImageID = GetGadgetState(#MyImgGadget)
SaveImage(MyImageID, MyPath, #PB_ImagePlugin_PNG, 10, 24) fails with
[ERROR] The specified #Image is not initialised - well, I can see the image displayed in the image gadget........
Also tried
SaveImage(ImageID(MyImageID), MyPath, #PB_ImagePlugin_PNG, 10, 24)
Anyone else see this happen?
Re: Image Gadget: GetGadgetState()
Posted: Sun Aug 05, 2012 6:18 am
by Danilo
GetGadgetState() returns an ImageID (the OS handle), whereas SaveImage() requires an #Image (PureBasic image number).
Try something like this:
Code: Select all
MyImageID = GetGadgetState(#MyImgGadget)
tempImage = CreateImage(#PB_Any,width,height,depth)
If StartDrawing( ImageOutput(tempImage) )
DrawImage(MyImageID,0,0)
StopDrawing()
SaveImage(tempImage, MyPath, #PB_ImagePlugin_PNG, 10, 24)
FreeImage(tempImage)
EndIf
Or save the #Image number of the image used with the ImageGadget.
Re: Image Gadget: GetGadgetState()
Posted: Sun Aug 05, 2012 9:28 am
by Danilo
If the ImageID returned by GetGadgetState() is from an PB-Image, you could try ImageFromImageID():
Code: Select all
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
CreateImage(1,200,300)
CreateImage(2,100,150)
img = CreateImage(#PB_Any,123,456)
Debug ImageFromImageID( ImageID(1) )
Debug ImageFromImageID( ImageID(2) )
Debug ImageFromImageID( ImageID(img) )
Debug ImageFromImageID( 12 ) ; wrong, not PB ImageID
If it is not an PB image, it returns -1.
Code: Select all
MyImageID = GetGadgetState(#MyImgGadget)
MyImage = ImageFromImageID(MyImageID)
If MyImage <> -1
SaveImage(MyImage, MyPath, #PB_ImagePlugin_PNG, 10, 24)
EndIf
Re: Image Gadget: GetGadgetState()
Posted: Sun Aug 05, 2012 2:20 pm
by IdeasVacuum
Hi Danilo thank you for your solutions, but more than that, for the explanation. My fix has been to keep a record of the PB Image IDs. I do think that this is a weak area in PB because there is no obvious distinction between the OS Handle and the PB ImageID in the Help - when there is a failure, the Compiler error message does not give any clue, especially when using CopyImage().
I think the easiest fix would be a wholesale improvement of the help, getting the terminology right is the key.
Re: Image Gadget: GetGadgetState()
Posted: Sat Nov 29, 2014 8:22 am
by mestnyi
can explain the difference between this example and the example of Danilo?
Code: Select all
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)
PB_Image_Objects
EndImport
Procedure ImageFromImageID(ImageID)
Protected id, result = -1
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
CreateImage(1,200,300)
CreateImage(2,100,150)
img = CreateImage(#PB_Any,123,456)
Debug ImageFromImageID( ImageID(1) )
Debug ImageFromImageID( ImageID(2) )
Debug ImageFromImageID( ImageID(img) )
Debug ImageFromImageID( 12 ) ; wrong, not PB ImageID
Re: Image Gadget: GetGadgetState()
Posted: Sat Nov 29, 2014 8:47 am
by Danilo
mestnyi wrote:can explain the difference between this example and the example of Danilo?
The difference is that your code imports the external PB system variable "PB_Image_Objects" in the Import section.
My old code gets the variable with ASM, because I didn't know back then that it's possible to Import variables.
Re: Image Gadget: GetGadgetState()
Posted: Sat Nov 29, 2014 11:12 am
by mestnyi
that is, there is no advantage in this?
Thank you for the quick response

Re: Image Gadget: GetGadgetState()
Posted: Sat Nov 29, 2014 11:21 am
by Danilo
mestnyi wrote:that is, there is no advantage in this?
Correct. Using Import/ImportC is easier to use and probably better for cross-platform programming.
See also
http://www.purebasic.fr/english/viewtop ... 7&start=12