Jump to content

Recommended Posts

Posted

Struggling a bit to get this GDI+ function converted to AutoIt.

#include <GDIPlus.au3>

_GDIPlus_Startup()

Global $hImage = _GDIPlus_ImageLoadFromFile("F:\DCIM\Camera\20170515_111804.jpg")

Global $tBufferSize = DllStructCreate("uint")
Global $tProperties = DllStructCreate("uint")
_GDIPlus_GetPropertySize($hImage, $tBufferSize, $tProperties)
Global $tAllItems = DllStructCreate("struct;char[" & DllStructGetData($tBufferSize, 1) & "];endstruct")
_GDIPlus_GetAllPropertyItems($hImage, $tBufferSize, $tProperties, $tPropertyItem)

_GDIPlus_ImageDispose($hImage)

_GDIPlus_Shutdown()

Func _GDIPlus_GetAllPropertyItems(ByRef $hImage, Const $tTotalBufferSize, Const $tNumProperties, ByRef $tAllItems)
    If (Not IsDllStruct($tPropertyItem)) Then Return SetError(-1, 0, "")
    Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetAllPropertyItems", "hwnd", $hImage, "unit", DllStructGetData($tTotalBufferSize, 1), "uint", DllStructGetData($tNumProperties, 1), "ptr", DllStructGetPtr($tAllItems))
    If (@error) Then Return SetError(@error, @extended, ConsoleWrite("@Error = " & @error & @LF))
    If ($aResult[0]) Then Return SetError($aResult[0], @extended, "")
    Return $aResult[0]
EndFunc   ;==>_GDIPlus_GetAllPropertyItems

Func _GDIPlus_GetPropertySize(Const ByRef $hImage, ByRef $tTotalBufferSize, ByRef $tNumProperties)
    If (Not IsDllStruct($tTotalBufferSize)) Then Return SetError(-1, 0, "")
    If (Not IsDllStruct($tNumProperties)) Then Return SetError(-2, 0, "")
    Local $aResult = DllCall($__g_hGDIPDll, "uint", "GdipGetPropertySize", "hwnd", $hImage, "uint_ptr", DllStructGetPtr($tTotalBufferSize), "uint_ptr", DllStructGetPtr($tNumProperties))
    If (@error) Then Return SetError(@error, @extended, "")
    If ($aResult[0]) Then Return SetError($aResult[0], 0, "")
    Return $aResult[0]
EndFunc   ;==>_GDIPlus_GetPropertySize

Got the GetPropertySize function to work, gives me the correct buffer size and the property count, but I cannot figure out how to get the struct for the all items.

Function on MSDN:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms535372(v=vs.85).aspx

Struct needed:

Quote

allItems [out]

    Type: PropertyItem*

    Pointer to an array of PropertyItem objects that receives the property items.

PropertyItem class:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms534493(v=vs.85).aspx

Found other topics about this function in other languages where they used a blank string as the buffer, so I tried using a char array, which doesn't work. Just cannot figure out how to create the struct buffer to hold the data.

Posted

Perfect, I had been googling that for a long time last night, searching the autoit forums, and never found the topic. Why are these not currently implemented in the latest GDIPlus.au3 file?

Posted
19 hours ago, InunoTaishou said:

Why are these not currently implemented in the latest GDIPlus.au3 file?

I've added some additional GDI+ functions last year already which will be released on the next beta but I cannot tell you when exactly but _GDIPlus_GetAllPropertyItems was not included.

The question is which of those GDI+ should be added and which not.

Please don't send me any personal message and ask for support! I will not reply!

Selection of finest graphical examples at Codepen.io

The own fart smells best!
Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...