Jump to content
Sign in to follow this  
UEZ

Help to understand C++ code

Recommended Posts

UEZ

I'm trying to understand following code which I want to convert to Autoit:

RedEyeCorrection

VOID Example_RedEyeSetParameters(HDC hdc)
{
   Graphics graphics(hdc);
   Image myImage(L"RedEyePhoto.jpg");

   REAL srcWidth = (REAL)myImage.GetWidth();
   REAL srcHeight = (REAL)myImage.GetHeight();
   RectF srcRect(0.0f, 0.0f, srcWidth, srcHeight);
   Matrix myMatrix(1.0f, 0.0f, 0.0f, 1.0f, 300.0f, 20.0f);

   RECT redAreas[2] = {40, 10, 55, 30, 110, 20, 125, 40};

   RedEyeCorrectionParams myRedEyeCorParams;
   myRedEyeCorParams.numberOfAreas = 2;
   myRedEyeCorParams.areas = redAreas;

   RedEyeCorrection myRedEyeCor;
   myRedEyeCor.SetParameters(&myRedEyeCorParams);

   // Draw the image with no change.
   graphics.DrawImage(&myImage, 20.0, 20.0, srcWidth, srcHeight);

   // Draw the image with the red eye correction.
   graphics.DrawImage(&myImage, &srcRect, &myMatrix, &myRedEyeCor, NULL, UnitPixel);
}

I made something like this here

Global $tRECT1 = DllStructCreate("long left;long top;long right;long buttom")
DllStructSetData($tRECT1, "left", 55)
DllStructSetData($tRECT1, "top", 69)
DllStructSetData($tRECT1, "right", 68)
DllStructSetData($tRECT1, "buttom", 81)
Global $pRECT1 = DllStructGetPtr($tRECT1)

Global $tRECT2 = DllStructCreate("long left;long top;long right;long buttom")
DllStructSetData($tRECT2, "left", 159)
DllStructSetData($tRECT2, "top", 68)
DllStructSetData($tRECT2, "right", 172)
DllStructSetData($tRECT2, "buttom", 81)
Global $pRECT2 = DllStructGetPtr($tRECT2)

Global Const $tagREDEYECORRECTIONPARAMS = "uint numberOfAreas;int areas[2]"
Global $tRedEye = DllStructCreate($tagREDEYECORRECTIONPARAMS)
Global Const $pRedEye = DllStructGetPtr($tRedEye)
DllStructSetData($tRedEye, "numberOfAreas", 2)
DllStructSetData($tRedEye, "areas", $tRECT1, 1)
DllStructSetData($tRedEye, "areas", $tRECT2, 2)
$hEffect = _GDIPlus_EffectCreate($GDIP_REDEYECORRECTIONEFFECT)
ConsoleWrite(_GDIPlus_EffectsSetParameters($hEffect, $pRedEye) & " / " & @error & @LF)

but it is not working - return code 8, error code 2.

I'm an absolute C++ noob and I hope somebody can help here. ;)

Br,

UEZ

Edited by UEZ

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
Ascend4nt

UEZ,

Your RECT structures must be contiguous in memory, so you have to create them in one DLLStruct, something like:

$tRECTs = DLLStructCreate("long[" & $nNumRects*4 "];")

Also the RedEyeCorrectionParams structure should be (the 2nd field gets a ptr to $tRECTS):

$tagREDEYECORRECTIONPARAMS = "uint numberOfAreas;ptr areas;"

Finally, I'm not sure about how you implement the 'SetParameters' call. It's defined like this in the Windows SDK:

GdipSetEffectParameters(CGpEffect *effect, const VOID *params, const UINT size);

..and called like this (although I'm not sure why sizeof(RECT) is used as its separate from the structure):

GdipSetEffectParameters(&Effect, &Params, sizeof(RedEyeCorrectionParams) + (sizeof(RECT) * nNumAreas) )

You might want to look at 'gdipluseffects.h" header in the Windows SDK, if you have it.

  • Like 1

Share this post


Link to post
Share on other sites
UEZ

Thanks Ascend4nt,

here whole code:

;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534056(v=vs.85).aspx
#include <GDIplus.au3>
#include <Memory.au3>

Global Const $GDIP_BLUREFFECT = "{633C80A4-1843-482b-9EF2-BE2834C5FDD4}"
Global Const $GDIP_BRIGHTNESSCONTRASTEFFECT = "{D3A1DBE1-8EC4-4c17-9F4C-EA97AD1C343D}"
Global Const $GDIP_COLORBALANCEEFFECT = "{537E597D-251E-48da-9664-29CA496B70F8}"
Global Const $GDIP_COLORCURVEEFFECT = "{DD6A0022-58E4-4a67-9D9B-D48EB881A53D}"
Global Const $GDIP_COLORLUTEFFECT = "{A7CE72A9-0F7F-40d7-B3CC-D0C02D5C3212}"
Global Const $GDIP_COLORMATRIXEFFECT = "{718F2615-7933-40e3-A511-5F68FE14DD74}"
Global Const $GDIP_HUESATURATIONLIGHTNESSEFFECT = "{8B2DD6C3-EB07-4d87-A5F0-7108E26A9C5F}"
Global Const $GDIP_LEVELSEFFECT = "{99C354EC-2A31-4f3a-8C34-17A803B33A25}"
Global Const $GDIP_REDEYECORRECTIONEFFECT = "{74D29D05-69A4-4266-9549-3CC52836B632}"
Global Const $GDIP_TINTEFFECT = "{1077AF00-2848-4441-9489-44AD4C2D7A2C}"
Global Const $GDIP_SHARPENEFFECT = "{63CBF3EE-C526-402c-8F71-62C540BF5142}"

_GDIPlus11_Startup()
If @error Then Exit MsgBox(0x40010, "Error", "GDI+ Effect Collection can run on operating systems Vista or newer only!")


Global $hBitmap = _GDIPlus_BMPFromMemory(_RedEye())
Global $iW = _GDIPlus_ImageGetWidth($hBitmap)
Global $iH = _GDIPlus_ImageGetHeight($hBitmap)
Global $hGUI = GUICreate("GDI+ v1.1 Effect Collection by UEZ 2013", $iW * 2, $iH, -1 , 100)
GUISetState()

Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsDrawImageRect($hGraphics, $hBitmap, $iW, 0, $iW, $iH)

Global $hEffect

Global $tRECTF = DllStructCreate($tagGDIPRECTF)
DllStructSetData($tRECTF, "X", 0)
DllStructSetData($tRECTF, "Y", 0)
DllStructSetData($tRECTF, "Width", $iW)
DllStructSetData($tRECTF, "Height", $iH)
Global $pRECTF = DllStructGetPtr($tRECTF)

;Color LUT
Global Const $tagCOLORLUTPARAMS = "byte ColorChannelLUTB[256];byte ColorChannelLUTG[256];byte ColorChannelLUTR[256];byte ColorChannelLUTA[256]"
Global $tColorLUT = DllStructCreate($tagCOLORLUTPARAMS)
For $i = 192  To 256
    DllStructSetData($tColorLUT, "ColorChannelLUTR", 0xA0, $i)
    DllStructSetData($tColorLUT, "ColorChannelLUTG", 0xB0, $i)
    DllStructSetData($tColorLUT, "ColorChannelLUTB", 0xC0, $i)
Next
$hEffect = _GDIPlus_ColorLUT($tColorLUT)
ConsoleWrite("Color LUT" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Blur
Global Const $tagBLURPARAMS = "float radius;bool expandEdge" ;0-255; False/True
Global $tBlur = DllStructCreate($tagBLURPARAMS)
$hEffect = _GDIPlus_Blur($tBlur, 10)
ConsoleWrite("Blur" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Brightness Contrast
Global Const $tagBRIGHTNESSCONTRASTPARAMS = "int brightnessLevel;int contrastLevel" ;-255-255; -100-100
Global $tBrightnessContrast = DllStructCreate($tagBRIGHTNESSCONTRASTPARAMS)
$hEffect = _GDIPlus_BrightnessContrast($tBrightnessContrast, -60, 90)
ConsoleWrite("Brightness Contrast" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Color Balance
Global Const $tagCOLORBALANCEPARAMS = "int cyanRed;int magentaGreen;int yellowBlue" ;-100-100; -100-100; -100-100
Global $tColorBalance = DllStructCreate($tagCOLORBALANCEPARAMS)
$hEffect = _GDIPlus_ColorBalance($tColorBalance, 60, -50, 20)
ConsoleWrite("Color Balance" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Color Curve
Global Enum $iAdjustExposure = 0, $iAdjustDensity, $iAdjustContrast,    $iAdjustHighlight, $iAdjustShadow, _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534098(v=vs.85).aspx
                            $iAdjustMidtone, $iAdjustWhiteSaturation, $iAdjustBlackSaturation
Global Enum $iCurveChannelAll = 0, $iCurveChannelRed, $iCurveChannelGreen, $iCurveChannelBlue ;http://msdn.microsoft.com/en-us/library/windows/desktop/ms534100(v=vs.85).aspx
Global Const $tagCOLORCURVEEFFECTPARAMS = "int type;int channel;int value"
Global $tColorCurve = DllStructCreate($tagCOLORCURVEEFFECTPARAMS)
$hEffect = _GDIPlus_ColorCurve($tColorCurve, $iAdjustHighlight, $iCurveChannelAll, 90)
ConsoleWrite("Color Curve" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Color Matrix
Global Const $tagGDIPCOLORMATRIXPARAMS = "float m[25];"
Global $tColorMatrix = DllStructCreate($tagGDIPCOLORMATRIXPARAMS)
Global $fRed = 0.66, $fGreen = 0.5, $fBlue = 0.5, $fAlpha = 1
$hEffect = _GDIPlus_ColorMatrix($tColorMatrix, $fRed, $fGreen, $fBlue, $fAlpha)
ConsoleWrite("Color Matrix" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Hue Saturation Lightness
Global Const $tagHUESATURATIONLIGHTNESSPARAMS = "int hueLevel;int saturationLevel;int lightnessLevel" ;-180-180; -100-100; -100-100
Global $tHueSaturationLightness = DllStructCreate($tagHUESATURATIONLIGHTNESSPARAMS)
$hEffect = _GDIPlus_HueSaturationLightness($tHueSaturationLightness, 90, -50, 20)
ConsoleWrite("Hue Saturation Lightness" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Levels
Global Const $tagLEVELSPARAMS = "int highlight;int midtone;int shadow" ;0-100; -100-100; 0-100
Global $tLevels = DllStructCreate($tagLEVELSPARAMS)
$hEffect = _GDIPlus_Levels($tLevels, 60, -50, 20)
ConsoleWrite("Levels" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Sharpen
Global Const $tagSHARPENPARAMS = "float radius;float amount" ;0-255; 0-100
Global $tSharpen = DllStructCreate($tagSHARPENPARAMS)
$hEffect = _GDIPlus_Sharpen($tSharpen, 60, 90)
ConsoleWrite("Sharpen" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Tint
Global Const $tagTINTPARAMS = "int hue;int amount" ;-180-180; -100-100
Global $tTint = DllStructCreate($tagTINTPARAMS)
$hEffect = _GDIPlus_Tint($tTint, 60, 40)
ConsoleWrite("Tint" & @CRLF)
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)
_GDIPlus_EffectDispose($hEffect)
Sleep(3000)

;Red Eye -> http://msdn.microsoft.com/en-us/library/windows/desktop/ms534928(v=vs.85).aspx
Global $nNumRects = 2
Global $tRECTs = DLLStructCreate("long[" & $nNumRects * 4  & "];")
DllStructSetData($tRECTs, 1, 50, 1)
DllStructSetData($tRECTs, 1, 64, 2)
DllStructSetData($tRECTs, 1, 50 + 22, 3)
DllStructSetData($tRECTs, 1, 64 + 18, 4)
DllStructSetData($tRECTs, 1, 155, 5)
DllStructSetData($tRECTs, 1, 64, 6)
DllStructSetData($tRECTs, 1, 155 + 21, 7)
DllStructSetData($tRECTs, 1, 64 + 18, 8)
Global Const $pRECTs = DllStructGetPtr($tRECTs)
Global Const $tagREDEYECORRECTIONPARAMS = "uint numberOfAreas;ptr areas;"
Global $tRedEye = DllStructCreate($tagREDEYECORRECTIONPARAMS)
Global Const $pRedEye = DllStructGetPtr($tRedEye)
DllStructSetData($tRedEye, "numberOfAreas", $nNumRects)
DllStructSetData($tRedEye, "areas", $pRECTs)

$hEffect = _GDIPlus_EffectCreate($GDIP_REDEYECORRECTIONEFFECT)
;~ ConsoleWrite(_GDIPlus_EffectsSetParametersRE($hEffect, $pRedEye, DllStructGetSize($tRedEye) + ($nNumRects * 4*4)) & " / " & @error & @LF)
ConsoleWrite("Red Eye" & @CRLF)
_GDIPlus_EffectsSetParameters($hEffect, $pRedEye, (DllStructGetSize($tRECTs) + DllStructGetSize($tRedEye)) / DllStructGetSize($tRedEye))
_GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect)

;~ $hBitmap_Effect = _GDIPlus_BitmapCreateApplyEffect($hBitmap, $hEffect)
;~ _GDIPlus_GraphicsDrawImage($hGraphics, $hBitmap_Effect, 0, 0)

$tBlur = 0
$tTint = 0
$tColorCurve = 0
$tSharpen = 0
$tColorMatrix = 0
$tBrightnessContrast = 0
$tLevels = 0
$tColorBalance = 0
$tColorColorChannelLUT = 0
$tRedEye = 0
$tRECTF1 = 0
$tRECTF2 = 0
$tRECTF = 0

Sleep(4000)
MsgBox(0, "", "Done", 15)

Do
Until GUIGetMsg() = -3


_GDIPlus_BitmapDispose($hBitmap)
;~ _GDIPlus_BitmapDispose($hBitmap_Effect)
_GDIPlus_GraphicsDispose($hGraphics)

_GDIPlus_Shutdown()

Exit

Func _GDIPlus_Blur($tBlur, $fRadius, $bExpandEdge = False)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tBlur, "radius", $fRadius)
    DllStructSetData($tBlur, "expandEdge", $bExpandEdge)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_BLUREFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tBlur))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_BrightnessContrast($tBrightnessContrast, $iBrightnessLevel, $iContrastLevel)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tBrightnessContrast, "brightnessLevel", $iBrightnessLevel)
    DllStructSetData($tBrightnessContrast, "contrastLevel", $iContrastLevel)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_BRIGHTNESSCONTRASTEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tBrightnessContrast))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_ColorBalance($tColorBalance, $iCyanRed, $iMagentaGreen, $iYellowBlue)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tColorBalance, "cyanRed", $iCyanRed)
    DllStructSetData($tColorBalance, "magentaGreen", $iMagentaGreen)
    DllStructSetData($tColorBalance, "yellowBlue", $iYellowBlue)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_COLORBALANCEEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tColorBalance))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_ColorCurve($tColorCurve, $iType, $iChannel, $iValue)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tColorCurve, "type", $iType)
    DllStructSetData($tColorCurve, "channel", $iChannel)
    DllStructSetData($tColorCurve, "value", $iValue)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_COLORCURVEEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tColorCurve))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_ColorLUT($tColorLUT)
    If Not IsDllStruct($tColorLUT) Then Return SetError(1, @error, 0)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_COLORLUTEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tColorLUT))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_ColorMatrix($tColorMatrix, $fRed, $fGreen, $fBlue, $fAlpha)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tColorMatrix, "m", $fRed, 1)
    DllStructSetData($tColorMatrix, "m", $fGreen, 7)
    DllStructSetData($tColorMatrix, "m", $fBlue, 13)
    DllStructSetData($tColorMatrix, "m", $fAlpha, 19)
    DllStructSetData($tColorMatrix, "m", 1, 25) ;the element in the fifth row and fifth column of a 5×5 homogeneous matrix must be 1, and all of the other elements in the fifth column must be 0
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_COLORMATRIXEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tColorMatrix))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_HueSaturationLightness($tHueSaturationLightness, $iHueLevel, $iSaturationLevel, $iLightnessLevel)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tHueSaturationLightness, "hueLevel", $iHueLevel)
    DllStructSetData($tHueSaturationLightness, "saturationLevel", $iSaturationLevel)
    DllStructSetData($tHueSaturationLightness, "lightnessLevel", $iLightnessLevel)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_HUESATURATIONLIGHTNESSEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tHueSaturationLightness))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_Levels($tLevels, $iHighlight, $iMidtone, $iShadow)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tLevels, "highlight", 60)
    DllStructSetData($tLevels, "midtone", -50)
    DllStructSetData($tLevels, "shadow", 20)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_LEVELSEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tLevels))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_Sharpen($tSharpen, $fRadius, $fAmount)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tSharpen, "radius", $fRadius)
    DllStructSetData($tSharpen, "amount", $fAmount)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_SHARPENEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tSharpen))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_Tint($tTint, $iHue, $iAmount)
    If Not IsDllStruct($tBlur) Then Return SetError(1, @error, 0)
    DllStructSetData($tTint, "hue", $iHue)
    DllStructSetData($tTint, "amount", $iAmount)
    Local $hEffect = _GDIPlus_EffectCreate($GDIP_TINTEFFECT)
    If @error Then Return SetError(2, @error, 0)
    _GDIPlus_EffectsSetParameters($hEffect, DllStructGetPtr($tTint))
    If @error Then Return SetError(3, @error, 0)
    Return $hEffect
EndFunc

Func _GDIPlus_EffectCreate($sEffectGUID, $pEffect = 0)
    Local $iI, $tGUID, $pGUID, $tElem, $aElem[4], $aResult
    $tGUID = _WinAPI_GUIDFromString($sEffectGUID)
    $pGUID = DllStructGetPtr($tGUID)
    $tElem = DllStructCreate("uint[4]", $pGUID)
    For $iI = 1 To 4
        $aElem[$iI - 1] = DllStructGetData($tElem, 1, $iI)
    Next
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateEffect", "uint", $aElem[0], "uint", $aElem[1], "uint", $aElem[2], "uint", $aElem[3], "uint*", $pEffect)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[5])
EndFunc   ;==>_GDIPlus_EffectCreate

Func _GDIPlus_EffectsSetParameters($hEffectObject, $pEffectParameters, $iSizeAdj = 1)
    Local $aSize = DllCall($ghGDIPDll, "uint", "GdipGetEffectParameterSize", "handle", $hEffectObject, "uint*", 0)
    Local $iSize = $aSize[2] * $iSizeAdj
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetEffectParameters", "handle", $hEffectObject, "ptr", $pEffectParameters, "uint", $iSize)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[3])
EndFunc   ;==>_GDIPlus_EffectsSetParameters

Func _GDIPlus_BitmapCreateApplyEffect($hBitmap, $hEffect, $pROI = 0, $pOutRect = 0, $hBmpOutput = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapCreateApplyEffect", _
            "ptr*", $hBitmap, _
            "int", 1, _
            "handle", $hEffect, _
            "ptr", $pROI, _
            "ptr", $pOutRect, _
            "int*", $hBmpOutput, _
            "int", 0, "ptr*", 0, "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[6])
EndFunc   ;==>_GDIPlus_BitmapCreateApplyEffect

Func _GDIPlus_EffectDispose($hEffect)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipDeleteEffect", "handle", $hEffect)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc   ;==>_GDIPlus_EffectDispose

Func _GDIPlus_BitmapApplyEffect($hBitmap, $hEffect, $pROI = 0)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapApplyEffect", "handle", $hBitmap, "handle", $hEffect, "ptr", $pROI, "int", 0, "ptr*", 0, "int*", 0)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc   ;==>_GDIPlus_BitmapApplyEffect

Func _GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect, $hMatrix = 0, $ImgAttributes = 0, $iUnit = 2)
    $aResult = DllCall($ghGDIPDll, "uint", "GdipDrawImageFX", "handle", $hGraphics, _
            "handle", $hBitmap, _
            "ptr", $pRECTF, _
            "handle", $hMatrix, _
            "handle", $hEffect, _
            "ptr", $ImgAttributes, _
            "uint", $iUnit)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[0] = 0)
EndFunc   ;==>_GDIPlus_DrawImageFX

Func _GDIPlus11_Startup() ;code by Authenticity - modified by UEZ
    Local $pInput, $tInput, $pToken, $tToken, $aResult, $os

    $giGDIPRef += 1
    If $giGDIPRef > 1 Then Return True

    Switch @OSVersion
        Case "WIN_VISTA", "WIN_2008"
            $ghGDIPDll = DllOpen(@WindowsDir & "\winsxs\x86_microsoft.windows.gdiplus_6595b64144ccf1df_1.1.6000.16386_none_8df21b8362744ace\gdiplus.dll")
        Case "WIN_2008R2", "WIN_7", "WIN_8"
            $ghGDIPDll = DllOpen(@SystemDir & "\gdiplus.dll")
        Case Else
            Return SetError(1)
    EndSwitch
;~     _WinAPI_Check("_GDIPlus_Startup (GDIPlus.dll not found)", @error, False)

    $tInput = DllStructCreate($tagGDIPSTARTUPINPUT)
    $pInput = DllStructGetPtr($tInput)
    $tToken = DllStructCreate("int Data")
    $pToken = DllStructGetPtr($tToken)
    DllStructSetData($tInput, "Version", 1)
    $aResult = DllCall($ghGDIPDll, "int", "GdiplusStartup", "ptr", $pToken, "ptr", $pInput, "ptr", 0)
    If @error Then Return SetError(@error, @extended, False)
    $giGDIPToken = DllStructGetData($tToken, "Data")
    Return $aResult[0] = 0
EndFunc   ;==>_GDIPlus11_Startup


#region Example Image
;======================================================================================
; Function Name:        _GDIPlus_BMPFromMemory
; Description:              Loads an image which is saved as a binary string and converts it to a bitmap or hbitmap
;
; Parameters:               $bImage:    the binary string which contains any valid image which is supported by GDI+
; Optional:                     $hHBITMAP:  if false a bitmap will be created, if true a hbitmap will be created
;
; Remark:                       hbitmap format is used generally for GUI internal images, $bitmap is more a GDI+ image format
;                                       Don't forget _GDIPlus_Startup() and _GDIPlus_Shutdown()
;
; Requirement(s):       GDIPlus.au3, Memory.au3 and _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Return Value(s):      Success: handle to bitmap (GDI+ bitmap format) or hbitmap (WinAPI bitmap format),
;                                       Error: 0
; Error codes:              1: $bImage is not a binary string
;                                       2: unable to create stream on HGlobal
;                                       3: unable to create bitmap from stream
;
; Author(s):                    UEZ
; Additional Code:      thanks to progandy for the MemGlobalAlloc and tVARIANT lines and
;                                       Yashied for _WinAPI_BitmapCreateDIBFromBitmap() from WinAPIEx.au3
; Version:                      v0.98 Build 2012-08-29 Beta
;=======================================================================================
Func _GDIPlus_BMPFromMemory($bImage, $hHBITMAP = False)
    If Not IsBinary($bImage) Then Return SetError(1, 0, 0)
    Local $aResult
    Local Const $memBitmap = Binary($bImage) ;load image  saved in variable (memory) and convert it to binary
    Local Const $len = BinaryLen($memBitmap) ;get length of image
    Local Const $hData = _MemGlobalAlloc($len, $GMEM_MOVEABLE) ;allocates movable memory  ($GMEM_MOVEABLE = 0x0002)
    Local Const $pData = _MemGlobalLock($hData) ;translate the handle into a pointer
    Local $tMem = DllStructCreate("byte[" & $len & "]", $pData) ;create struct
    DllStructSetData($tMem, 1, $memBitmap) ;fill struct with image data
    _MemGlobalUnlock($hData) ;decrements the lock count  associated with a memory object that was allocated with GMEM_MOVEABLE
    $aResult = DllCall("ole32.dll", "int", "CreateStreamOnHGlobal", "handle", $pData, "int", True, "ptr*", 0) ;Creates a stream object that uses an HGLOBAL memory handle to store the stream contents
    If @error Then Return SetError(2, 0, 0)
    Local Const $hStream = $aResult[3]
    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromStream", "ptr", $hStream, "int*", 0) ;Creates a Bitmap object based on an IStream COM interface
    If @error Then Return SetError(3, 0, 0)
    Local Const $hBitmap = $aResult[2]
    Local $tVARIANT = DllStructCreate("word vt;word r1;word r2;word r3;ptr data; ptr")
    DllCall("oleaut32.dll", "long", "DispCallFunc", "ptr", $hStream, "dword", 8 + 8 * @AutoItX64, _
                                           "dword", 4, "dword", 23, "dword", 0, "ptr", 0, "ptr", 0, "ptr", DllStructGetPtr($tVARIANT)) ;release memory from $hStream to avoid memory leak
    $tMem = 0
    $tVARIANT = 0
    If $hHBITMAP Then
        Local Const $hHBmp = _WinAPI_BitmapCreateDIBFromBitmap($hBitmap)
        _GDIPlus_BitmapDispose($hBitmap)
        Return $hHBmp
    EndIf
    Return $hBitmap
EndFunc   ;==>_GDIPlus_BMPFromMemory

Func _WinAPI_BitmapCreateDIBFromBitmap($hBitmap) ;create 32-bit bitmap v5 (alpha channel supported)
    Local $tBIHDR, $aRet, $tData, $pBits, $hResult = 0
    $aRet = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
    If (@error) Or ($aRet[0]) Then Return 0
    $tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $aRet[2], $aRet[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $pBits = DllStructGetData($tData, 'Scan0')
    If Not $pBits Then Return 0
    $tBIHDR = DllStructCreate(  'dword bV5Size;long bV5Width;long bV5Height;word bV5Planes;word bV5BitCount;dword bV5Compression;' & _ ;http://msdn.microsoft.com/en-us/library/windows/desktop/dd183381(v=vs.85).aspx
                                                                'dword bV5SizeImage;long bV5XPelsPerMeter;long bV5YPelsPerMeter;dword bV5ClrUsed;dword bV5ClrImportant;'  & _
                                                                'dword bV5RedMask;dword bV5GreenMask;dword bV5BlueMask;dword bV5AlphaMask;dword bV5CSType;' & _
                                                                'int bV5Endpoints[3];dword bV5GammaRed;dword bV5GammaGreen;dword bV5GammaBlue;dword bV5Intent;' & _
                                                                'dword bV5ProfileData;dword bV5ProfileSize;dword bV5Reserved')
    DllStructSetData($tBIHDR, 'bV5Size', DllStructGetSize($tBIHDR))
    DllStructSetData($tBIHDR, 'bV5Width', $aRet[2])
    DllStructSetData($tBIHDR, 'bV5Height', $aRet[3])
    DllStructSetData($tBIHDR, 'bV5Planes', 1)
    DllStructSetData($tBIHDR, 'bV5BitCount', 32)
    DllStructSetData($tBIHDR, 'bV5Compression', 0) ; $BI_BITFIELDS = 3, $BI_RGB = 0, $BI_RLE8 = 1, $BI_RLE4 = 2, $RGBA = 0x41424752
    DllStructSetData($tBIHDR, 'bV5SizeImage', $aRet[3] * DllStructGetData($tData, 'Stride'))
    DllStructSetData($tBIHDR, 'bV5AlphaMask', 0xFF000000)
    DllStructSetData($tBIHDR, 'bV5RedMask', 0x00FF0000)
    DllStructSetData($tBIHDR, 'bV5GreenMask', 0x0000FF00)
    DllStructSetData($tBIHDR, 'bV5BlueMask', 0x000000FF)
    DllStructSetData($tBIHDR, 'bV5CSType', 2) ; LCS_WINDOWS_COLOR_SPACE = 2
    DllStructSetData($tBIHDR, 'bV5Intent', 4) ; $LCS_GM_IMA
    $hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    If (Not @error) And ($hResult[0]) Then
        DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $aRet[2] * $aRet[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
        $hResult = $hResult[0]
    Else
        $hResult = 0
    EndIf
    _GDIPlus_BitmapUnlockBits($hBitmap, $tData)
    $tData = 0
    $tBIHDR = 0
    Return $hResult
EndFunc   ;==>_WinAPI_BitmapCreateDIBFromBitmap

;Code below was generated by: 'File to Base64 String' Code Generator v1.11 Build 2012-10-13

Func _RedEye($bSaveBinary = False)
    Local $RedEye
    $RedEye &= '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'
    $RedEye &= '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'
    $RedEye &= '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'
    $RedEye &= 'PJvnlqagq9uiG/DQNJJgAcUXGSMZ7KL13Eb4qF4zt3p6ZWJ2pNo0NuSEyBTlLURfX5TH6UWnIT3GSZpG6ypQWCPaqrC46M7K6db8oUdI+v2q8ZuMsvay8CHZDiEzHbB/ztRcdVrheiS66Fb3ykNlspQCVLLatJ9Ej/mrxuvsuTGZTtner/Cdq2VrtluJKIUAtsHBxE8xE/WtvO/ly342G/S2z6Vc27LqrB3wH0K0KWAFKiJMTtNFyv5LHiwxvp1npVzcuOfj7hbzyFSgr+VaT6cVlbG/r16Mek9ONovAIbMphX9Pp7fzWVu1mybYBRIAA5FTo5XfD/LgigX2EfZOk+xiiFSe4BLnlgDsaaKy1h5U5gfvVlDq1OUj+9JR1ZxpBJoPQ1sZncUtq0s8KR3nigac/BIUpJ0kkAxQWkk2SQsL0gkHc96eyoli3DYJTAJOowOaexpZ4BUo+UCOZxS0vyd0aVHWJKe5x7096L31ArpASHAZByDWdu1TH6J31anDzxUr1ox6cjIoVPyfW6Ybmc04m3vSi6SQIpVWN2Uv4XkUGi2SFAfWgriYMiVBSTmnLpllj0PSmQBpCgfmB2NbTLbKTSIa0rOkxicmiz8L312kpHiJOpOoYml2lSLdtJXpABWRI+1G9Jsrn4dCVakoA7UrRJftwtwJgSTmoaSPlIjJ7cUyVuJAB3njtQAbiJ0JOfY0SFSa4SA6dRVPMU0sbbL/ADIwD6VVTicWipVSXD20kjsDS2uQ0aEpmlT0uHptSVpNBV2k7AUxZFqZ2gyc0y0uQmABuKe0Lwny5mPUUtjTjqUpTnkbGptVJSbqSiExsd6nTSQkmVx/hpi3ZzYAhIAHvSXIdshUCmm6V3JMeaJoohRcGFGalVfJAUJHFUUGWg1DP09KBTJsTGPN6U50yuK4gKgqAntVeW0+Nit3IATgU9iREo1wDwZqb2J0ivO9A0iUnMjFBuKACTPOKYDOTp0nE0iCkEmNj7bU4jImu2CXiQmfWJp6Z3Jh2TpeO2eRV0SnFgQVb4qK1h9YqwNqTWQ1ZWCkZPaKS/EQ0JIFB6EIRIx9TRImrktZ82QO5imla2jzegO45pBelHlk/rQX2483KZ3HNKwRlOvPBDhQNzSWW2oLj2ODFB4zfbTWLPlGnehVpqhJ0HNNNDvSqaR60UX6SmTSNRbvAhOaEnNsn5SNt/pTPezBKfMJkH7U7C+ktkwRn0pFrb4pO6TB5FMtflHTiTijQsR0RMgRxT0NRBZgRvS9H4qlCSBMA003pQ7CQdQzxTSBuFqTqEHJ70Ismi19KdcmZIkgHatNMba8+bUA4QJlJkexoohxYEFJqK2w7p/aKgR6Um2JowePtQ0GW5gKJneltVFtkwNMCc0t6Tr8iEnVO5o2nWl7aVGBRoroShsxjviKrSELiAkDgDilQ8+6ss3HUnA2ZAMCkvW/Y7pdvoAKhvSVrTSWbcwR2pxNujBLZKDzVaTsM63pGAB+9TYveyu9RLapk44qauELqVNHUnYGTTgyjR9Bc/EMJ9O/FOM7+TtLeOZqtDaK0ebvilYccclOIkd6Qk2gtWBERz60bPxRK9ScDIp7GtXtUogST2oFgJTyi6RPEAVMt2rLCaQfjSFGP2FWw0AdVEmJIPtTjPPoGsIWokuAe+9aRzW9vPFNli5dgeVUgTuKPoS9mljgwZgYNRXThT+2XEHmpb4wzZWMK2k0mkn0MaOpU8T96VVrQ1lMKKyeMdhUlb9D2cHOYFVEUQggenFOVOl04gnNUNfYS/c8GxcX8sAgVNK91jen22tZcVuTNIzYAIAA4pHDCxcBFVBkfMut/hzqGa0+nPd7Lbp1KcztUVtiWFfiFQJ9qhpeuwz9uFIWRFA2s+FdQfWjiYpxnl1Gq0gYmrKXaI22kzmkdQWBJxP0pU4GVkHSDUrUKGmc79jQr2pUqNvaKCoUu+YgJxsT/anBlj1vat9coAjIJidqbHRY8tXeCREE+u9XjGPJYDui'
    $RedEye &= 'oLTITOkcxV1zMR1BJS6FxAMggimIMsly4SR8wmKzrp4+4f2sGIial0SmVqrYGY2qdtBzRmOB70KGtqlG+AaQ+xrSpkAZoTYLbO/mTHJO1OJXpOTBFVE0t+I1lVkWxvvS32Un2QdMWE28xsNqkWFfUeq3NoS7cMBNtqjUDn3qpNn3PXZ30q9beZQ60sFKtqXob8jZNwQmAZFVstQLcvApMmKR+iBHV1P3C2unsl7RusmE/Sjx/I8rTZDq120rToPINTs/sR8Np/Mec2BMCnCyaqAU7mYq2c6VE5IzPrSa6UrIB/mkYd0fMQJpKlDrViDgUjCuKIwTjgUGGdUQoJn0kU0++wr64RAPpvimzy6BnJEyMc9j/wAVri4+W/QFweI4olJVBiTRWWmUuwNAK4JCgPrEftNVA7YLMpGCoAZHHvUZN+M+tFQN5/aorqx7NGFYEcZqa0hgyoadJpKHM7gk4FIDkeVKTgmmn2JQdWMGR2pi9C2SNOo04yy36L7/AEuJUk5MVNvasZ0z7P8A6N0hf/tk9tqKLPoTfItL+2DflzxwaXtWONx7L0234BcNAeGdwBgVcZZXsR47mMGPSjQ8ppU6lV2PDJKUH5vbtT9FvdMOmN9PsGilISkRsNgai2NrhllFV04i7XptgVTuRgUvYxxsOumNBhoIMd6acjVpUiqiFTh0qnmitJ2pcURJI47UtqkCrUcgc9zSUoUomR259KAFdgEQJgzQAr51TjmZp+y9AnVaSEJwfWqkY53fYdKwlhzOIjV2EnH1rXH04c72Vu3S2nFJQec6hzWdt2JCfqzBZZ7DVO23b960xLL3YCs1gLMQIzjmlk14z61VpEDPes66cabW7kBIJ42AqWkMrdcAxEdqTTQxo5Sc/WkDBkyQcmmkU3uCKCtWOLCZ3iltGthHDKiRgmltpPWglyylwEKAIjkUHKXL6eEL1sah3AODStVMtTVMha62xr+aKuVz5e1RsztnNPaPGCEWf5agAB60rVToInp7ZXK06ozBqPt0+V9DbdlKT8okbUy2MSdJ2zRtFXtuYHFOVNixyFIJJqhLqh1zsPuaTTc+wroknGIoPYZxXIkwd6DDunyaeIyaC39hn3PmgASPpTRZoA+sgKKonseKqOfkv4C3EJ0TnVkg44n61rXJWavLhX4p0mVEmSRNYZZarfHHoT1R0uWzobSFypQPuMx+la4M+X/vIrQwpBnVM7/tRVYHlooxEzUV0Y2G1uoTvioaymVuoxuZ2E0mko5gmRJwaDM2VTjahmKQ4AN5o2VVOrzMZqbVYqyed6AiZJM8cUz2taQCRjNJGVGttpKIj9KuMrX3hxxinobWBseHPP8Aeke+wbqYXMDNRemsvSl19LbjaVTKsAxTt0vDC5S2LgrO0UqlJK4pbC8Lx6VUqUVq82aez+gziSTj2oPYR48Zg9jTOBFqkiSByZoOhn9iRsMY7U2VoF0AvQSkgEA/Srxc2d6DXylpWYASdMgRtxV2ucht2g+lThVEqxisNb7dmONs6ZD4P6i89069bfWta0veIVkzMiumyS9OG2+W6e4UsGIkgCOPKDtUVthTK0mTxmKixvKaW6sEZxUVriZMrIUJpVriPaOUig9mFucJ9aSbRBUYEUk7cnaeaBKiFSfQUj2mkSByfWmW1rf2EU5E0e2sBkECrnplfbhdEHFGzkSS7qSMR2o9wa0oeTmDzU2HMgq0hwDUNjik2xysfJKisgxAxUn9Jp3PtS2m1NKiFAb0wm4cA0ylDPKg01TsC6rWJ43FNfoK5kCQNJmnCtDkkygGABNNjnfsvcUUztG3rNaRz53ZX1G40NPOpEeQx6YoyvTKTt5v1jrvULbqLrNq8W2kQNMcwKMMJZtr/Uyx6j//2Q=='
    Local $bString = Binary(_Base64Decode($RedEye))
    If $bSaveBinary Then
        Local $hFile = FileOpen(@ScriptDir & "\220px-BoldRedEye.JPG", 18)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return  $bString
EndFunc   ;==>_RedEye

Func _Base64Decode($sB64String)
    Local $struct = DllStructCreate("int")
    Local $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $sB64String, "int", 0, "int", 1, "ptr", 0, "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(1, 0, "")
    Local $a = DllStructCreate("byte[" & DllStructGetData($struct, 1) & "]")
    $a_Call = DllCall("Crypt32.dll", "int", "CryptStringToBinary", "str", $sB64String, "int", 0, "int", 1, "ptr", DllStructGetPtr($a), "ptr", DllStructGetPtr($struct, 1), "ptr", 0, "ptr", 0)
    If @error Or Not $a_Call[0] Then Return SetError(2, 0, "")
    Return DllStructGetData($a, 1)
EndFunc   ;==>_Base64Decode
#endregion

All other FX are working except teh red eye one!

It is still not working when I did it the way you described. Hmmm....

Br,

UEZ

Edited by UEZ

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites
Ascend4nt

I added an alternative function call to 'GdipSetEffectParameters' which accepts a size, and also fixed the code where you set the "areas" structure member, and it seems to return okay. However, I don't actually see anything displayed in the GUI when I select a picture, so I'm not sure what that's about.

Here's the code adjustments:

Func _GDIPlus_EffectsSetParametersRE($hEffectObject, $pEffectParameters, $nSize)
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipSetEffectParameters", "handle", $hEffectObject, "ptr", $pEffectParameters, "uint", $nSize)
    If @error Then Return SetError(@error, @extended, 0)
    Return SetError($aResult[0], 0, $aResult[3])
EndFunc   ;==>_GDIPlus_EffectsSetParameters

Global $nNumRects = 2
Global $tRECTs = DLLStructCreate("long[" & $nNumRects * 4  & "];")
DllStructSetData($tRECTs, 1, 55, 1)
DllStructSetData($tRECTs, 1, 69, 2)
DllStructSetData($tRECTs, 1, 68, 3)
DllStructSetData($tRECTs, 1, 81, 4)
DllStructSetData($tRECTs, 1, 159, 5)
DllStructSetData($tRECTs, 1, 68, 6)
DllStructSetData($tRECTs, 1, 172, 7)
DllStructSetData($tRECTs, 1, 81, 8)
Global Const $tagREDEYECORRECTIONPARAMS = "uint numberOfAreas;ptr areas;"
Global $tRedEye = DllStructCreate($tagREDEYECORRECTIONPARAMS)
Global Const $pRedEye = DllStructGetPtr($tRedEye)
DllStructSetData($tRedEye, "numberOfAreas", $nNumRects)
DllStructSetData($tRedEye, "areas", DllStructGetPtr($tRECTs))
$hEffect = _GDIPlus_EffectCreate($GDIP_REDEYECORRECTIONEFFECT)
;ConsoleWrite(_GDIPlus_EffectsSetParameters($hEffect, $pRedEye) & " / " & @error & @LF)
ConsoleWrite(_GDIPlus_EffectsSetParametersRE($hEffect, $pRedEye, DllStructGetSize($tRedEye) + ($nNumRects * 4*4)) & " / " & @error & @LF)
  • Like 1

Share this post


Link to post
Share on other sites
UEZ

Ascend4nt,

thank you very much for your help! Now it seems to work whereas I've to check the coordinates of the red eyes.

Indeed, I forgot the line _GDIPlus_DrawImageFX($hGraphics, $hBitmap, $pRECTF, $hEffect) to display the affected image.

I updated the code from post#3.

Br,

UEZ

Edited by UEZ

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!
¯\_(ツ)_/¯  ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ

Share this post


Link to post
Share on other sites

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
Sign in to follow this  

  • Similar Content

    • guinness
      By guinness
      #include <Array.au3> #include <ButtonConstants.au3> #include <GUIConstantsEx.au3> ; Proof of concept for using the control id as an index item for an array. I created back on 8th April 2013. Example() Func Example() ; Create the GUI. Local $iHeight = 400, $iWidth = 400 Local $hGUI = GUICreate('', $iWidth, $iHeight) GUISetState(@SW_SHOW, $hGUI) ; Declare variables to be used throughout the example. Local Const $BUTTON_ROWS_COLUMNS = 8 Local Enum $eCTRL_HWND, $eCTRL_VALUE, $eCTRL_MAX Local $aMsg[1][$eCTRL_MAX], _ $iButtonHeight = $iHeight / $BUTTON_ROWS_COLUMNS, _ $iButtonWidth = $iWidth / $BUTTON_ROWS_COLUMNS, _ $iControlID = 0 For $i = 0 To $BUTTON_ROWS_COLUMNS - 1 For $j = 0 To $BUTTON_ROWS_COLUMNS - 1 $iControlID = GUICtrlCreateButton($i & ',' & $j, $i * $iButtonWidth, $j * $iButtonHeight, $iButtonWidth, $iButtonHeight, $BS_CENTER) ; Increase the size of the array if the control id is greater than or equal to the total size of the array. If $iControlID >= UBound($aMsg) Then ReDim $aMsg[Ceiling($iControlID * 1.3)][$eCTRL_MAX] EndIf ; Add to the array. $aMsg[$iControlID][$eCTRL_HWND] = GUICtrlGetHandle($iControlID) $aMsg[$iControlID][$eCTRL_VALUE] = 'Sample string for the control id: ' & $iControlID Next Next ; Clear empty items after the last created control id. ReDim $aMsg[$iControlID + 1][$eCTRL_MAX] ; Display the array created. _ArrayDisplay($aMsg) Local $iMsg = 0 While 1 $iMsg = GUIGetMsg() Switch $iMsg Case $GUI_EVENT_CLOSE ExitLoop Case $aMsg[$eCTRL_HWND][$eCTRL_HWND] To UBound($aMsg) ; If $iMsg is greater than 0 and between the 0th index of $aMsg and the last item then display in the console. If $iMsg > 0 Then ConsoleWrite('Control Hwnd: ' & $aMsg[$iMsg][$eCTRL_HWND] & ', ' & $aMsg[$iMsg][$eCTRL_VALUE] & @CRLF) EndIf EndSwitch WEnd GUIDelete($hGUI) EndFunc ;==>Example  
    • c.haslam
      By c.haslam
      I think that this UDF should return a Property Item that can readily be set as a property of another image. Why would one want to do this? A script might (as one of mine does) edit an image of a .jpg file then write the result to a .jpg file. In editing it, in my case, the number of horizontal and vertical pixels change, and the date/time edited should be set as a property. All other property items remain the same. Other GDI+ users may change other properties.
      So an approach is to copy all the property items from image1 to image2, then update a few properties.
      M$ provides a Property Item class (id, length, pointer to an array of values) but _GDIPlus_ImageGetPropertyItem returns something different.
      I think that, wherever reasonable, UDFs that are wrappers for M$ methods should work like M$'s methods. _GDIPlus_ImageGetPropertyItem does not do this:
      There is a bug in _GDIPlus_ImageGetPropertyItem: the Case Else should have $iValues = $iBytes not $iValues = 1 While M$ returns 2 values for a value that is a ratio of 2 numbers,  _GDIPlus_ImageGetPropertyItem returns numerator/denominator as a single value (often a Double). _GDIPlus_ImageSetPropertyItem (when included in GDIPlus.au3) will be unable to set ratio property items properly because it cannot know what the numerator and denominator are. So copying such property items will not work properly. M$ has a Void* buffer where the buffer is an array of values but _GDIPlus_ImageGetPropertyItem() returns the values in the same 1-d array as id, length and type. M$'s approach produces a 1-d array with the same number of elements for all property items while _GDIPlus_ImageGetPropertyItem produces a 1-d array with various numbers of elements. To me, this is not good programming practice. For a photo from a Sony camera, the worst case has 1-d array with 67 elements. When combined into a 2-d array with the property items of all properties, there are 66 rows and 67 columns, with many elements not used. So I suggest that _GDIPlus_ImageGetPropertyItem look like this:
      ; #FUNCTION# ==================================================================================================================== ; Name ..........: cGDIPlus_ImageGetPropertyItem ; Description ...: Gets a specified property item (piece of meta data) from an Image object ; Syntax ........: cGDIPlus_ImageGetPropertyItem($hImage, $iPropID) ; Parameters ....: $hImage - Pointer to an image object ; $iPropID - Identifier of the property item to be retrieved ; Return values .: Success: Array containing the values of the property item ; [0] - identifier ; [1] - size, in bytes, of the value array ; [2] - type of value(s) in the value array ; [3] - value array ; Failure: Sets the @error flag to non-zero, @extended may contain GPSTATUS error code ($GPID_ERR*). ; Author ........: Eukalyptus ; Modified ......: c.haslam ; Remarks .......: types: unsigned byte = 1, ASCII string = 2, unsigned short = 3, unsigned long = 4, ; unsinged rational = 5, signed byte = 6, undefined = 7, signed long = 9, ; signed rational = 10 ; Related .......: _GDIPlus_ImageGetPropertyIdList ; Link ..........: https://msdn.microsoft.com/en-us/library/windows/desktop/ms535390(v=vs.85).aspx, ; https://msdn.microsoft.com/en-us/library/windows/desktop/ms534493(v=vs.85).aspx, ; https://msdn.microsoft.com/en-us/library/windows/desktop/ms534414(v=vs.85).aspx ; Example .......: Yes ; =============================================================================================================================== Func cGDIPlus_ImageGetPropertyItem($hImage, $iPropID) Local $iSize = __GDIPlus_ImageGetPropertyItemSize($hImage, $iPropID) If @error Then Return SetError(@error, @extended, -1) Local $tBuffer = DllStructCreate("byte[" & $iSize & "];") Local $pBuffer = DllStructGetPtr($tBuffer) Local $aResult = DllCall($__g_hGDIPDll, "int", "GdipGetPropertyItem", "handle", $hImage, "uint", _ $iPropID, "uint", $iSize, "struct*", $tBuffer) If @error Then Return SetError(@error, @extended, -1) If $aResult[0] Then Return SetError(10, $aResult[0], False) Local $tPropertyItem = DllStructCreate("int id; int length; short type; ptr value;", $pBuffer) Local $iBytes = DllStructGetData($tPropertyItem, "length") Local $pValue = DllStructGetData($tPropertyItem, "value") Local $aRet[4] Local $type = DllStructGetData($tPropertyItem,'type') Local $tValues, $iValues Switch $type Case 2 ;ASCII String $iValues = 1 $tValues = DllStructCreate("char[" & $iBytes & "];", $pValue) Case 3 ;Array of UShort $iValues = Int($iBytes / 2) $tValues = DllStructCreate("ushort[" & $iValues & "];", $pValue) Case 4, 5 ;Array of UInt / Fraction $iValues = Int($iBytes / 4) $tValues = DllStructCreate("uint[" & $iValues & "];", $pValue) Case 9, 10 ;Array of Int / Fraction $iValues = Int($iBytes / 4) $tValues = DllStructCreate("int[" & $iValues & "];", $pValue) Case Else ;Array of Bytes $iValues = $iBytes $tValues = DllStructCreate("byte[" & $iBytes & "];", $pValue) EndSwitch $aRet[0] = DllStructGetData($tPropertyItem,'id') $aRet[1] = $iBytes $aRet[2] = $type Local $aVals[$iValues] If $type=2 Or $type=7 Then ; ASCII string or undefined $aVals[0] = DllStructGetData($tValues,1) Else For $i = 0 To $iValues-1 $aVals[$i] = DllStructGetData($tValues,1,$i+1) Next EndIf $aRet[3] = $aVals Return $aRet EndFunc And here is an example:
      #include <GDIPlus.au3> #include <Array.au3> Example() Func Example() _GDIPlus_Startup() Local $hImage = _GDIPlus_ImageLoadFromFile(RegRead((@AutoItX64 = True ? "HKLM\SOFTWARE\Wow6432Node\AutoIt v3\AutoIt" : "HKLM\SOFTWARE\AutoIt v3\AutoIt"), "InstallDir") & "\Examples\GUI\Torus.png") If @error Then _GDIPlus_Shutdown() MsgBox(16, "", "An error has occured - unable to load image!", 30) Return False EndIf Local $ar = _GDIPlus_ImageGetPropertyIdList($hImage) Local $vPropNbrs[UBound($ar,1)-1] ; Extract ID numbers For $i = 1 To UBound($ar,1)-1 $vPropNbrs[$i-1] = $ar[$i][0] Next ; Get all property items Local $aPropItems[UBound($vPropNbrs)][4],$vPropItem For $i = 0 To UBound($vPropNbrs)-1 $vPropItem = cGDIPlus_ImageGetPropertyItem($hImage,$vPropNbrs[$i]) For $j = 0 To 3 $aPropItems[$i][$j] = $vPropItem[$j] Next Next ; Collapse values arrays so _ArrayDisplay can display them Local $ar = $aPropItems For $i = 0 To UBound($aPropItems,1)-1 $ar[$i][0] = '0x'&Hex($ar[$i][0],4) $ar[$i][3] = '' For $j = 0 To UBound($aPropItems[$i][3])-1 $ar[$i][3] &= ($aPropItems[$i][3])[$j]&'|' Next $ar[$i][3] = StringTrimRight($ar[$i][3],1) Next _ArrayDisplay($ar) _GDIPlus_Shutdown() EndFunc Unfortunately this example (based on one now the Help) does not exercise most of the item types, but I do not know of a file with EXIF metadata that is on most PCs. The code for implementing and calling _GDIPlus_ImageSetPropertyItem will be fairly simple.
       
      Your thoughts?
       
    • c.haslam
      By c.haslam
      I have a strange symptom of a problem somewhere in my code, or in a UDF: when I add code to get all properties of a GDI+ image to a 6000-line script,  the variable type of a parameter is reported as a pointer when the caller clearly has this argument as a string. If I comment out my code that gets the properties, the function properly sees the parameter as a string.
      [Edit: The reporting as a pointer and getting image properties are miles apart, both in where they are in the script code and in where they are run.]
      At this point, I am looking for clues as to why this is happening, so the hunt is on!
      I have noticed one odd thing, in _GDIPlus_ImageGetPropertyIdList() I see a line that begins Local $sPropertyTagInfo = . This "line" is split into 2 lines. SCiTE shows that the first line is 2454 characters and the second 2400. Adding these numbers I get 4854 characters.
      But the Help for AutoIt3 Limits/defaults says that MAXLINESIZE, Maximum size for a line of script, is 4096 characters.
      The line would exceed the limit if AutoIt considers the subject line to be 1 line and not 2 lines.
      My question: is this line legal? Is buffer overun possible?
    • corz
      By corz
      Associative Array Functions
      I've seen a couple of UDFs for this on the forum. One of them I quite like. But it's still nearly not as good as this method, IMHO.
      I don't recall if I discovered the "Scripting.Dictionary" COM object myself or if I got the original base code from somewhere online. I have recently searched the web (and here) hard for any AutoIt references to this, other than my own over the years I've been using this (in ffe, etc..), and I can find nothing, so I dunno. If anyone does, I'd love to give credit where it's due; this is some cute stuff! It could actually be all my own work! lol
      At any rate, it's too useful to not have posted somewhere at autoitscript.com, so I've put together a wee demo.
      For those who haven't heard of the COM "Scripting.Dictionary".. 
      If you've ever coded in Perl or PHP (and many other languages), you know how useful associative arrays are. Basically, rather than having to iterate through an array to discover it's values, with an associative array you simply pluck values out by their key "names".
      I've added a few functions over the years, tweaked and tuned, and this now represent pretty much everything you need to easily work with associative arrays in AutoIt. En-joy!
      The main selling point of this approach is its simplicity and weight. I mean, look at how much code it takes to work with associative arrays! The demo is bigger than all the functions put together! The other selling point is that we are using Windows' built-in COM object functions which are at least theoretically, fast and robust.
      I've used it many times without issues, anyhow, here goes..
      ; Associative arrays in AutoIt? Hells yeah! ; Initialize your array ... global $oMyError = ObjEvent("AutoIt.Error", "AAError") ; Initialize a COM error handler ; first example, simple. global $simple AAInit($simple) AAAdd($simple, "John", "Baptist") AAAdd($simple, "Mary", "Lady Of The Night") AAAdd($simple, "Trump", "Silly Man-Child") AAList($simple) debug("It is said that Trump is a " & AAGetItem($simple, "Trump") & ".", @ScriptLineNumber);debug debug("") ; slightly more interesting.. $ini_path = "AA_Test.ini" ; Put this prefs section in your ini file.. ; [test] ; foo=foo value ; foo2=foo2 value ; bar=bar value ; bar2=bar2 value global $associative_array AAInit($associative_array) ; We are going to convert this 2D array into a cute associative array where we ; can access the values by simply using their respective key names.. $test_array = IniReadSection($ini_path, "test") for $z = 1 to 2 ; do it twice, to show that the items are *really* there! for $i = 1 to $test_array[0][0] $key_name = $test_array[$i][0] debug("Adding '" & $key_name & "'..");debug ; key already exists in "$associative_array", use the pre-determined value.. if AAExists($associative_array, $key_name) then $this_value = AAGetItem($associative_array, $key_name) debug("key_name ALREADY EXISTS! : =>" & $key_name & "<=" , @ScriptLineNumber);debug else $this_value = $test_array[$i][1] ; store left=right value pair in AA if $this_value then AAAdd($associative_array, $key_name, $this_value) endif endif next next debug(@CRLF & "Array Count: =>" & AACount($associative_array) & "<=" , @ScriptLineNumber);debug AAList($associative_array) debug(@CRLF & "Removing 'foo'..");debug AARemove($associative_array, "foo") debug(@CRLF & "Array Count: =>" & AACount($associative_array) & "<=" , @ScriptLineNumber);debug AAList($associative_array) debug(@CRLF & "Removing 'bar'..");debug AARemove($associative_array, "bar") debug(@CRLF & "Array Count: =>" & AACount($associative_array) & "<=" , @ScriptLineNumber);debug AAList($associative_array) quit() func quit() AAWipe($associative_array) AAWipe($simple) endfunc ;; Begin AA Functions func AAInit(ByRef $dict_obj) $dict_obj = ObjCreate("Scripting.Dictionary") endfunc ; Adds a key and item pair to a Dictionary object.. func AAAdd(ByRef $dict_obj, $key, $val) $dict_obj.Add($key, $val) If @error Then return SetError(1, 1, -1) endfunc ; Removes a key and item pair from a Dictionary object.. func AARemove(ByRef $dict_obj, $key) $dict_obj.Remove($key) If @error Then return SetError(1, 1, -1) endfunc ; Returns true if a specified key exists in the associative array, false if not.. func AAExists(ByRef $dict_obj, $key) return $dict_obj.Exists($key) endfunc ; Returns a value for a specified key name in the associative array.. func AAGetItem(ByRef $dict_obj, $key) return $dict_obj.Item($key) endfunc ; Returns the total number of keys in the array.. func AACount(ByRef $dict_obj) return $dict_obj.Count endfunc ; List all the "Key" > "Item" pairs in the array.. func AAList(ByRef $dict_obj) debug("AAList: =>", @ScriptLineNumber);debug local $k = $dict_obj.Keys ; Get the keys ; local $a = $dict_obj.Items ; Get the items for $i = 0 to AACount($dict_obj) -1 ; Iterate the array debug($k[$i] & " ==> " & AAGetItem($dict_obj, $k[$i])) next endfunc ; Wipe the array, obviously. func AAWipe(ByRef $dict_obj) $dict_obj.RemoveAll() endfunc ; Oh oh! func AAError() Local $err = $oMyError.number If $err = 0 Then $err = -1 SetError($err) ; to check for after this function returns endfunc ;; End AA Functions. ; debug() (trimmed-down version) ; ; provides quick debug report in your console.. func debug($d_string, $ln=false) local $pre ; For Jump-to-Line in Notepad++ if $ln then $pre = "(" & $ln & ") " & @Tab ConsoleWrite($pre & $d_string & @CRLF) endfunc  
      ;o) Cor
    • c.haslam
      By c.haslam
      I find _GDIPlus_ImageClone in the Help, but neither in SciTe auto-complete nor in GDIPlus.au3
      Shoud this be reported in Trac?
      By searching the forum (and changing the name of the first arguement ot DLLCall, the code appears to be:
      Func _GDIPlus_ImageClone($hImage) Local $aResult = DllCall($__g_hGDIPDll, "uint", "GdipCloneImage", "handle", $hImage, "int*", 0) If @error Then Return SetError(@error, @extended, 0) Return $aResult[2] EndFunc ;==>_GDIPlus_ImageClone  
×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.