Image Gadget: GetGadgetState()

Windows specific forum
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Image Gadget: GetGadgetState()

Post 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........ :shock:

Also tried SaveImage(ImageID(MyImageID), MyPath, #PB_ImagePlugin_PNG, 10, 24)

Anyone else see this happen?
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: Image Gadget: GetGadgetState()

Post 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.
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: Image Gadget: GetGadgetState()

Post 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
IdeasVacuum
Always Here
Always Here
Posts: 6426
Joined: Fri Oct 23, 2009 2:33 am
Location: Wales, UK
Contact:

Re: Image Gadget: GetGadgetState()

Post 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.
IdeasVacuum
If it sounds simple, you have not grasped the complexity.
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Image Gadget: GetGadgetState()

Post 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
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: Image Gadget: GetGadgetState()

Post 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.
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Image Gadget: GetGadgetState()

Post by mestnyi »

that is, there is no advantage in this?
Thank you for the quick response :)
User avatar
Danilo
Addict
Addict
Posts: 3036
Joined: Sat Apr 26, 2003 8:26 am
Location: Planet Earth

Re: Image Gadget: GetGadgetState()

Post 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
Post Reply