snify Posted January 11, 2013 Share Posted January 11, 2013 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 More sharing options...
UEZ Posted January 11, 2013 Share Posted January 11, 2013 (edited) There is no fill function in GDI+, so I wrote one. Try this: expandcollapse popup#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: expandcollapse popup#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 &= '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' $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 January 12, 2013 by UEZ snify 1 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 More sharing options...
snify Posted January 12, 2013 Author Share Posted January 12, 2013 This is really good and well made. Thank you so much! Link to comment Share on other sites More sharing options...
UEZ Posted January 12, 2013 Share Posted January 12, 2013 (edited) 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:expandcollapse popup#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) EndFuncBr,UEZ Edited January 13, 2013 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now