Jump to content

FloodFill without direct GDI


snify
 Share

Recommended Posts

Not sure if it goes here or in general help :/

Anyway, I would like to use FloodFill without the GDI or convert at least the DC format to HBITMAP.

Here is what I would like to do:

1. Take a screenshot (_ScreenCapture_Capture)

2. Create a solid brush

3. Select the Object of the HBITMAP from the screenshot

4. FloodFill a certain area with a certain color

5. Save the output back to a file or HBITMAP.

The Problem is that you need a GUI/Handle to do all that. Any other ways to do all this in the background instead in front of the nose of the user?!

Thank you for your help :)

Link to comment
Share on other sites

There is no fill function in GDI+, so I wrote one. :)

Try this:

#include <GDIPlus.au3>

$sRegPath = "HKLM\SOFTWARE\AutoIt v3\AutoIt"
If StringInStr("X64IA64", @OSArch) Then $sRegPath = StringReplace($sRegPath, "SOFTWARE", "SOFTWARE\Wow6432Node")

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif")

$iColor2Fill = 0xFFFFFFFF
;~ _GDIPlus_FloodFill($hImage, 10, 10, 0xFF000080, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 73, 22, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 88, 27, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 99, 38, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 109, 32, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 120, 37, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 120, 37, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 141, 41, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_FloodFill($hImage, 153, 43, $iColor2Fill, 0xFFFFFF00)
_GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Filled.png")
_GDIPlus_ImageDispose($hImage)
_GDIPlus_Shutdown()
ShellExecute(@ScriptDir & "\Filled.png")

Exit

Func _GDIPlus_FloodFillRec(ByRef $hBitmap, $iX, $iY, $iColorOld, $iColorNew) ;coded by UEZ 2013-01-12
    Local Static $iRec = 1
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapGetPixel", "handle", $hBitmap, "int", $iX, "int", $iY, "uint*", 0)
    If $aResult[4] = "0x" & Hex($iColorOld, 8) Then
        DllCall($ghGDIPDll, "uint", "GdipBitmapSetPixel", "handle", $hBitmap, "int", $iX, "int", $iY, "uint", $iColorNew)
    Else
        Return 0
    EndIf
    Local $iRecLimit = 3899
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetImageDimension", "handle", $hBitmap, "float*", 0, "float*", 0)
    If ($iX + 1) < $aResult[2] + 1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX + 1, $iY, $iColorOld, $iColorNew) ;go east
        $iRec -= 1
    EndIf
    If ($iY + 1) < $aResult[3] + 1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX, $iY + 1, $iColorOld, $iColorNew) ;go south
        $iRec -= 1
    EndIf
    If ($iX - 1) > -1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX - 1, $iY, $iColorOld, $iColorNew) ;go west
        $iRec -= 1
    EndIf
    If ($iY - 1) > -1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX, $iY - 1, $iColorOld, $iColorNew) ;go north
        $iRec -= 1
    EndIf
    Return 1
EndFunc   ;==>_GDIPlus_FloodFillRec

It will fill the white color insite the AutoIt logo with color yellow.

Another example:

#include <Memory.au3>
#include <GDIPlus.au3>

_GDIPlus_Startup()
$hImage = _GDIPlus_BMPFromMemory(_ChristianClub())

_GDIPlus_FloodFill($hImage, 200, 200, 0xFFFFFFFF, 0xFF0000FF)
_GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Filled.png")
_GDIPlus_BitmapDispose($hImage)
_GDIPlus_Shutdown()
ShellExecute(@ScriptDir & "\Filled.png")

Exit

Func _GDIPlus_FloodFillRec(ByRef $hBitmap, $iX, $iY, $iColorOld, $iColorNew) ;coded by UEZ 2013-01-12
    Local Static $iRec = 1
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapGetPixel", "handle", $hBitmap, "int", $iX, "int", $iY, "uint*", 0)
    If $aResult[4] = "0x" & Hex($iColorOld, 8) Then
        DllCall($ghGDIPDll, "uint", "GdipBitmapSetPixel", "handle", $hBitmap, "int", $iX, "int", $iY, "uint", $iColorNew)
    Else
        Return 0
    EndIf
    Local $iRecLimit = 3899
    $aResult = DllCall($ghGDIPDll, "uint", "GdipGetImageDimension", "handle", $hBitmap, "float*", 0, "float*", 0)
    If ($iX + 1) < $aResult[2] + 1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX + 1, $iY, $iColorOld, $iColorNew) ;go east
        $iRec -= 1
    EndIf
    If ($iY + 1) < $aResult[3] + 1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX, $iY + 1, $iColorOld, $iColorNew) ;go south
        $iRec -= 1
    EndIf
    If ($iX - 1) > -1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX - 1, $iY, $iColorOld, $iColorNew) ;go west
        $iRec -= 1
    EndIf
    If ($iY - 1) > -1 Then
        $iRec += 1
        If $iRec = $iRecLimit Then Return -1
        _GDIPlus_FloodFillRec($hBitmap, $iX, $iY - 1, $iColorOld, $iColorNew) ;go north
        $iRec -= 1
    EndIf
    Return 1
EndFunc   ;==>_GDIPlus_FloodFillRec

;======================================================================================
; 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 _ChristianClub($bSaveBinary = False)
    Local $ChristianClub
    $ChristianClub &= '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'
    $ChristianClub &= 'ohevKYcCQpKZpAQGCMUHzsO07naI+t2nBpkHRaZTkOEajFDyEsgyFnAiLJunHT8JOhAlpJQBnSGMoujPGFoylRhbT9DaFE90JnT/CoBsqB5fObeCpVOZANVo7jK6RiSiIlLBRCN91nQ4j4aQjkhTIPQIOdIdjal+ZRPOHydYQcXcEi35RJGXmFk2grq0WyXqJkhbaKZWim6gW4ta+kT10SKmaizQMMSbSGq0c3YvQTAF0hiH98yXqlCr0lAqTHsJp65kNZQsFKVba+i1We5UY5jC2CDVNNSOiiyBaXKIXiX51tQQJ30WbRgu7+Qd4OyUcWL8mTsLe1SSmJJwVVXpGIBZTG/ipl946shctzJOifIir2LkS1Ad5tnJfg9kc8iIsMp5q9XObZsPPCwF3ehavgyxZuQMrFl0CkujKpSivmucOC8XuyOJloyv/xutayAr2FpGVbe1nSxwL/s+mUL3LEWb7hUruUzWgtV6YQuiQXMG3lVZDruh3Vg5V7g5XIY1s6r7id+iC9/4yhc7f4UtkuDVvxx+U6zMFa5h65tJ/qQujmx8rqVWAt4Dj6m/dCWwbAv3MlghTbsWlqrrNNw+qxmKv4ptm2YtO8V8PoLCggXdYcKWTYQO+HyfJUrp7MliZWlUMPDAZGmHqzC43vi1ztQaR3mE10ietxmNCzIEXSReim4XOmlbGAGZrGHfFg9cHUYpKIPBH0FZ+bvL3TIyJYPgF4fXddQdZX5N97/YVpd9tVSKaXKrZTIvWcaexLPQivzlpzXrjG2FIv+ft2QhBQtPyl/GS5zU20pDS9qKiuMxua7rJZM+er4SXqupBIxoTuZ0xuv0RVIvXJNEcrp7pwl1o39rZOMyejNlktVdy7xdXMuHtsaCtGbaTGdF49jAmkrpm99IX1NfZ4BPaOOj2pkrYgMZxaTu2j5G3Os855jZQIEkYZPt3aNWO1Rh9bWfF9zsXc4HEE0lcrjFretJrQ1Wi272TENWZ2MDu8tJNjGxZsluvdyz1OL4nLWSoqIhg7vf/l4Zp8LMV+TOuUYo0dKwl6Zv/Tw3yp6ujr0kG8iaadqPFB8g2kSsV6QI1d29kXPADzoT6f4Zcw61OK/+pm7MaEteMo85mmn/GlCUWzxI4UWlxwXaYm6PkKGOtk/9QtayGtert/tmNb8DduuhLn18AcqUZ2Hc33fc+9g0rGdx8gUeoTDt1VS/epBofvY9T9vF5sInwBuOuKfzBoZpTy227ExVVsK95Gf/4c+DznR463jdeZ6kvd/edqmlveaPrfqh/xo6om/bH5NneP86vnDBD35ou6a05Scud63r18tGD5VEMRtdaTPe6jr/qRlKb3qEiJO3qFc86PV+e3knnr6yn/JNON561o9ZW/PyqZKp3emHAh3yR78aihDmdg5y3YLQ8jr0U8/ywLds9GX3oXWwOvdJ0379yd+6+/+7eajETsVjJ2v6Q/98/+pvnd6LIXaMs85+nlcq3Lc4avNMUhdsGPdPRLJeJEd6xaZxAKh6AvgUPRZ9jUd2A4hhOWZLpIU88WZjl9Z50uEyPSaB4wZ5YId+cEYX9tVUUGU8hxeA+vchw4eB+EeBoHVVPOdkK7iAuUaDC8Vz7HFuM9d/MaZKU/N5IKNw6jIzSSQLbIaCPBV5AVaFA3h9d3GDdUd+M0Qlh1ZpVzh7JkRlOLh8NXhKlXc+gqNw6BRmPmM97yeHo6U3W2hXZlhZXUiAwyMjdkMl1rd5pQB8lyUjnmMYELYsq3aGfEgh/QJ4EVUqlrMo6rVyjqdW/4ZuWsgT+UZPOHKHQniJByJzxf8XWAP3MMpVfnTIMHwFe9NFYlFHFX1CQnHYdXi1T2VlhPo0KJFmf4z4ECfoEqpig72XJt9HTBVmTn8HQL+1d2hliNQGjBpITJXoe611NtQ4gxCySsEzVrw4hd8yJ4xBf2lYCyLHhWqkZ8EyjBV4jjblWoaUTHinC9G4GkoEMPQ4gRmIfGSDgC6kdEnHYZqEXmBI'
    $ChristianClub &= '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'
    $ChristianClub &= 'urOZWZsbaWR7wTpczrCrgWEqxRD7VtlCtPerTF0lyloLuLY8YDZym2ljzXUjxgqrZpmcQDgUtLXFWUW8Uc7sz4GHRA19JpMXs/6EyZp8xdkqSvB4gwUs0R4doX6ax66Eq8FMYDV8WtrcQf6r0AzsF/KrVUoby1XsxMPswe0iaEqGabvhNyY8riT8zHuswL4UtCj/Z4r3+sQKOc5XlnJJPWJ9d9C1c7slacJCfW3IwqP0fFhE/UfpPHU6RGNVLQ8wTcpus8mI7NV55Hxp/RLcHHq/+MvXzFhaHNdrzdY9vacvbawxHZJ6HYG5W0eMrKalbMci0nSml5oj575Rim4cTUUF1aVf+KNDZ9iHTaQCG05845HESollkc9YHNmr55+qmRFPLcVOE4WZHRqoPJBNQ7UpvdDdVlIyvc3gKMesi4XWpFpiPbnWuNsr69tG7bnALRyuHanxjL2PqNJ3jNzdbNUWeNJYVrKI3dQeM9IBna6rjN3MPdmPPWlajWgJ3cqvgNsyZtYL4ZZyHd0eFMnd697woYzBP9aV+Tsthnyz6U0mMznfyf3cJeVTAUTeWFk5ELHf0JeMoz3G2qsn620n6uRqyo2Jm42JFE4s8V3h8nNWAT62GM6XzurWgj2+EJ7E2FTgk6KD/WjiCS7eLg7jMe7iLS7j8mfcNX40kYvj7sraKb7jculEIv7jAAI0Ejvk1zhhRw7ddazkJa7aTQ7lUS7lU07lVW7lV47lWa7lW87lu1AAADs='
    Local $bString = Binary(_Base64Decode($ChristianClub))
    If $bSaveBinary Then
        Local $hFile = FileOpen(@ScriptDir & "\Europe.gif", 18)
        FileWrite($hFile, $bString)
        FileClose($hFile)
    EndIf
    Return  $bString
EndFunc   ;==>_ChristianClub

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

I know this is not GDI but GDI+. Maybe it fulfill your needs, too.

Limitation: recursion max. level of 3899 (x86).

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

Link to comment
Share on other sites

There is unfortunately one problem with the code: recursion level limit.

When I find some stressless time I will do the iterativ way to bypass the recursion level limit issue.

Here the iterative way:

#include <GDIPlus.au3>

$sRegPath = "HKLM\SOFTWARE\AutoIt v3\AutoIt"
If StringInStr("X64IA64", @OSArch) Then $sRegPath = StringReplace($sRegPath, "SOFTWARE", "SOFTWARE\Wow6432Node")

_GDIPlus_Startup()
$hImage = _GDIPlus_ImageLoadFromFile(RegRead($sRegPath, "InstallDir") & "\Examples\GUI\logo4.gif")
$iW = _GDIPlus_ImageGetWidth($hImage)
$iH = _GDIPlus_ImageGetHeight($hImage)
$hGUI = GUICreate("Test", $iW, $iH)
GUISetState()
$hGfx = _GDIPlus_GraphicsCreateFromHWND($hGUI)
AdlibRegister("UpdateView", 10)

$iColor2Fill = 0xFFFFFFFF
_GDIPlus_FloodFillIter2($hImage, 0, 0, 0xFF000080, 0xFFFFFF00)
_GDIPlus_ImageSaveToFile($hImage, @ScriptDir & "\Filled.png")
;~ ShellExecute(@ScriptDir & "\Filled.png")
AdlibUnRegister("UpdateView")
ConsoleWrite("Done" & @LF)
Do
Until GUIGetMsg() = -3

_GDIPlus_ImageDispose($hImage)
_GDIPlus_GraphicsDispose($hGfx)
_GDIPlus_Shutdown()
Exit

Func _GDIPlus_FloodFillIter2(ByRef $hBitmap, $iX, $iY, $iColorOld, $iColorNew) ;coded by UEZ 2013-01-13
    Local $aResult = DllCall($ghGDIPDll, "uint", "GdipGetImageDimension", "handle", $hBitmap, "float*", 0, "float*", 0)
    Local $iW = $aResult[2], $iH = $aResult[3]
    If BitOR($iX < 0, $iY < 0, $iX > $iW - 1, $iY > $iH - 1) Then Return SetError(1, 0, 0)
    Local $x, $y, $i = 1
    Local $oD = ObjCreate('Scripting.Dictionary')
    $oD.Add($i, $iX & ";" & $iY) ;push
    $i += 1
    While $oD.Count > 0
        $sPoint = $oD.Item($i - 1)
        $oD.Remove($i - 1) ;pop
        $i -= 1
        $x = Int(StringRegExpReplace($sPoint, "(\d+);\d+", "$1"))
        $y = Int(StringRegExpReplace($sPoint, "\d+;(\d+)", "$1"))
        If BitOR($x < 0, $y < 0, $x > $iW - 1, $y > $iH - 1) Then ContinueLoop
        $aResult = DllCall($ghGDIPDll, "uint", "GdipBitmapGetPixel", "handle", $hBitmap, "int", $x, "int", $y, "uint*", 0)
        If $aResult[4] = "0x" & Hex($iColorOld, 8) Then
            DllCall($ghGDIPDll, "uint", "GdipBitmapSetPixel", "handle", $hBitmap, "int", $x, "int", $y, "uint", $iColorNew)
            $oD.Add($i, $x + 1 & ";" & $y) ;push
            $i += 1
            $oD.Add($i, $x & ";" & $y + 1) ;push
            $i += 1
            $oD.Add($i, $x - 1 & ";" & $y) ;push
            $i += 1
            $oD.Add($i, $x & ";" & $y - 1) ;push
            $i += 1
        EndIf
    WEnd
    $oD = 0
    Return 1
EndFunc   ;==>_GDIPlus_FloodFillIter2

Func UpdateView()
    _GDIPlus_GraphicsDrawImage($hGfx, $hImage, 0, 0)
EndFunc

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

Link to comment
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
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...