Yashied Posted January 11, 2015 Posted January 11, 2015 (edited) This small function allows you to add an alpha channel (mask) to the specified GDI+ bitmap (see screenshots). Source bitmap and mask may be of any color depth. The output bitmap is always 32 bits-per-pixel with alpha channel. Optionally, the alpha channel may be generated from any channel of the specified mask (1 - Red, 2 - Green, 3 - Blue, or 0 - Alpha). The example below is written for Autoit 3.3.12.0. expandcollapse popup#Include <GDIPlus.au3> If StringRegExpReplace(@AutoItVersion, '(?<!\d)(\d)(?!\d)', '0\1') < '03.03.12.00' Then MsgBox(16, 'Error', 'Require AutoIt 3.3.12.0 or later.') EndIf _GDIPlus_Startup() $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Image.png') $hAlpha = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Alpha.png') $hResult = _GDIPlus_BitmapCreateBitmapWithAlpha($hBitmap, $hAlpha, 1) _GDIPlus_ImageSaveToFile($hResult, @ScriptDir & '\Image+Alpha.png') _GDIPlus_BitmapDispose($hResult) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_BitmapDispose($hAlpha) _GDIPlus_Shutdown() Func _GDIPlus_BitmapCreateBitmapWithAlpha($hBitmap, $hAlpha, $iChannel = 0) Local $hGraphics, $hBmp[2], $bProc, $tProc, $pProc, $Size1, $Size2, $Lenght, $Result Local $tData[2] = [$GDIP_ILMWRITE, $GDIP_ILMREAD] $Size1 = DllCall($__g_hGDIPDll, 'uint', 'GdipGetImageDimension', 'handle', $hBitmap, 'float*', 0, 'float*', 0) If (@Error) Or ($Size1[0]) Then Return 0 EndIf $Size2 = DllCall($__g_hGDIPDll, 'uint', 'GdipGetImageDimension', 'handle', $hAlpha, 'float*', 0, 'float*', 0) If (@Error) Or ($Size2[0]) Then Return 0 EndIf $hBmp[0] = _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $Size1[2], $Size1[3], $GDIP_PXF32ARGB) If ($Size1[2] = $Size2[2]) And ($Size1[3] = $Size2[3]) Then $hBmp[1] = $hAlpha Else $hBmp[1] = _GDIPlus_BitmapCreateFromScan0($Size1[2], $Size1[3], $GDIP_PXF32ARGB) $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBmp[1]) _GDIPlus_GraphicsClear($hGraphics, 0) _GDIPlus_GraphicsDrawImageRect($hGraphics, $hAlpha, 0, 0, $Size1[2], $Size1[3]) _GDIPlus_GraphicsDispose($hGraphics) EndIf If ($iChannel < 0) Or ($iChannel > 3) Then $iChannel = 0 EndIf For $i = 0 To 1 $tData[$i] = _GDIPlus_BitmapLockBits($hBmp[$i], 0, 0, $Size1[2], $Size1[3], $tData[$i], $GDIP_PXF32ARGB) Next If @AutoItX64 Then $bProc = Binary('0x48894C240848895424104C894424184C894C24205541574831C0505050504883EC2848837C24600074054831C0EB0748C7C0010000004821C00F858100000048837C24680074054831C0EB0748C7C0010000004821C07555837C24700074054831C0EB0748C7C0010000004821C0752A4C637C24784D21FF7C0D4C637C24784983FF037F02EB0948C7C001000000EB034831C04821C07502EB0948C7C001000000EB034831C04821C07502EB0948C7C001000000EB034831C04821C07502EB0948C7C001000000EB034831C04821C0740B4831C04863C0E9950000004C8B7C24604983C7034C897C24284C8B7C246848634424784929C74983C7034C897C243048C7442438000000004C637C247049FFCF4C3B7C24387C4A488B6C24284C0FB67D00488B6C2430480FB645004C0FAFF84C89F848C7C1FF000000489948F7F94989C74C89F850488B6C24305888450048834424280448834424300448FF44243871A748C7C0010000004863C0EB034831C04883C448415F5DC3') Else $bProc = Binary('0x555331C0505050837C241800740431C0EB05B80100000021C07568837C241C00740431C0EB05B80100000021C07545837C242000740431C0EB05B80100000021C075228B5C242421DB7C0B8B5C242483FB037F02EB07B801000000EB0231C021C07502EB07B801000000EB0231C021C07502EB07B801000000EB0231C021C07502EB07B801000000EB0231C021C0740431C0EB6B8B5C241883C303891C248B5C241C2B5C242483C303895C2404C7442408000000008B5C24204B3B5C24087C368B2C240FB65D008B6C24040FB645000FAFD889D8B9FF00000099F7F989C3538B6C240458884500830424048344240404FF44240871BFB801000000EB0231C083C40C5B5DC21000') EndIf $Length = BinaryLen($bProc) $pProc = DllCall('kernel32.dll', 'ptr', 'VirtualAlloc', 'ptr', 0, 'ulong_ptr', $Length, 'dword', 0x1000, 'dword', 0x0040) $tProc = DllStructCreate('byte[' & $Length & ']', $pProc[0]) DllStructSetData($tProc, 1, $bProc) $Result = DllCallAddress('uint', $pProc[0], 'ptr', $tData[0].Scan0, 'ptr', $tData[1].Scan0, 'uint', $Size1[2] * $Size1[3], 'uint', $iChannel) If Not $Result[0] Then ; Nothing EndIf DllCall('kernel32.dll', 'int', 'VirtualFree', 'ptr', $pProc[0], 'ulong_ptr', 0, 'dword', 0x4000) For $i = 0 To 1 _GDIPlus_BitmapUnlockBits($hBmp[$i], $tData[$i]) Next If $hBmp[1] <> $hAlpha Then _GDIPlus_BitmapDispose($hBmp[1]) EndIf Return $hBmp[0] EndFunc ;==>_GDIPlus_BitmapCreateBitmapWithAlphaFunction + ExamplePrevious downloads: 47GDIPlus_BitmapCreateBitmapWithAlpha.zip Edited January 13, 2015 by Yashied KaFu 1 My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
mLipok Posted January 11, 2015 Posted January 11, 2015 (edited) If @AutoItVersion <> '3.3.12.0' Then ?? small typo ?? Edited January 11, 2015 by mLipok Signature beginning:* Please remember: "AutoIt"..... * Wondering who uses AutoIt and what it can be used for ? * Forum Rules ** ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button: Spoiler Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 * My contribution to others projects or UDF based on others projects: * _sql.au3 UDF * POP3.au3 UDF * RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * Useful links: * Forum Rules * Forum etiquette * Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX IE Related: * How to use IE.au3 UDF with AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions * EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *I also encourage you to check awesome @trancexx code: * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors * HTML editor * winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/ "Homo sum; humani nil a me alienum puto" - Publius Terentius Afer"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming" , be and \\//_. Anticipating Errors : "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty." Signature last update: 2023-04-24
UEZ Posted January 11, 2015 Posted January 11, 2015 Can you post the ASM code please (if possible with comments)?Thanks.Br,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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
Gianni Posted January 11, 2015 Posted January 11, 2015 .... ;~If @AutoItVersion <> '3.3.12.0' Then ;~ MsgBox(16, 'Error', 'Require AutoIt 3.3.12.0 or later.') ;~EndIf .... this should do: (from >here) ; use 3 digits for each portion of the version without dots ; (Leading zeros are not needed) ; 3.3.12.0 -> 003.003.012.000 -> 3003012000 If _AutoItVersion() < 3003012000 Then MsgBox(16, 'Error', 'Require AutoIt 3.3.12.0 or later.') EndIf Func _AutoItVersion() Local $aAutoItV = StringSplit(@AutoItVersion, ".", 2) Return StringFormat("%03i%03i%03i%03i", $aAutoItV[0], $aAutoItV[1], $aAutoItV[2], $aAutoItV[3]) EndFunc ;==>_AutoItVersion p.s. sorry for the little offtopic hijacking mLipok 1 Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....
guinness Posted January 11, 2015 Posted January 11, 2015 Excellent code. I too would like to "study" the ASM code. -_0 UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018
mLipok Posted January 11, 2015 Posted January 11, 2015 (edited) this should do: (from >here) ; use 3 digits for each portion of the version without dots ; (Leading zeros are not needed) ; 3.3.12.0 -> 003.003.012.000 -> 3003012000 If _AutoItVersion() < 3003012000 Then MsgBox(16, 'Error', 'Require AutoIt 3.3.12.0 or later.') EndIf Func _AutoItVersion() Local $aAutoItV = StringSplit(@AutoItVersion, ".", 2) Return StringFormat("%03i%03i%03i%03i", $aAutoItV[0], $aAutoItV[1], $aAutoItV[2], $aAutoItV[3]) EndFunc ;==>_AutoItVersion p.s. sorry for the little offtopic hijacking I was just wondering how to solve the "task", which @Yashied want to use. EDIT: My example. Edited January 12, 2015 by mLipok Signature beginning:* Please remember: "AutoIt"..... * Wondering who uses AutoIt and what it can be used for ? * Forum Rules ** ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button: Spoiler Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 * My contribution to others projects or UDF based on others projects: * _sql.au3 UDF * POP3.au3 UDF * RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * Useful links: * Forum Rules * Forum etiquette * Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX IE Related: * How to use IE.au3 UDF with AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions * EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *I also encourage you to check awesome @trancexx code: * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors * HTML editor * winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/ "Homo sum; humani nil a me alienum puto" - Publius Terentius Afer"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming" , be and \\//_. Anticipating Errors : "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty." Signature last update: 2023-04-24
Gianni Posted January 11, 2015 Posted January 11, 2015 I was just wondering how to solve the "task", which @Yashied want to use. ... I've already thought >few days ago ... Chimp small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....
Yashied Posted January 12, 2015 Author Posted January 12, 2015 (edited) I too would like to "study" the ASM code.I didn't write ASM code, I wrote and compiled DLL in other language and then retrieved a binary code of appropriate function. In AutoIt this function looks like this, but in AutoIt it takes a lot of time.Func _AddAlpha($pBits1, $pBits2, $iWidth, $iHeght, $iChannel) If (Not $pBits1) Or (Not $pBits2) Or ($iChannel < 0) Or ($iChannel > 3) Then Return 0 Local $iOffset = 3 - $iChannel For $i = 0 To $iWidth * $iHeght * 4 - 4 Step 4 Local $tData1 = DllStructCreate('byte', $pBits1 + $i + 3) Local $tData2 = DllStructCreate('byte', $pBits2 + $i + $iOffset) DllStructSetData($tData1, 1, DllStructGetData($tData1, 1) * DllStructGetData($tData2, 1) / 255) Next Return 1 EndFuncRetrieving binary code:#Include <WinAPIEx.au3> $File = FileOpenDialog('Select File', @ScriptDir, 'Libraries (*.dll)|All Files (*.*)', 1 + 2) If Not $File Then Exit EndIf $hModule = _WinAPI_LoadLibrary($File) If Not $hModule Then MsgBox(0x00040010, 'Error', 'Unable to load ' & StringRegExpReplace($File, '^.*\\', '') & '.') Exit EndIf Do $pFirst = _WinAPI_GetProcAddress($hModule, 'First') If @Error Then MsgBox(0x00040010, 'Error', '"First()" procedure not found.') ExitLoop EndIf $pLast = _WinAPI_GetProcAddress($hModule, 'Last') If @Error Then MsgBox(0x00040010, 'Error', '"Last()" procedure not found.') ExitLoop EndIf $tData = DllStructCreate('byte[' & Number($pLast - $pFirst) & ']', $pFirst) If @Error Then MsgBox(0x00040010, 'Error', 'Invalid addresses.') ExitLoop EndIf $Code = String(DllStructGetData($tData, 1)) ConsoleWrite($Code & @CR) ClipPut($Code) Until 1 _WinAPI_FreeLibrary($hModule)Here Alpha.dll (x86) for example. Edited January 12, 2015 by Yashied My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
guinness Posted January 12, 2015 Posted January 12, 2015 Ah OK, thanks. UDF List: _AdapterConnections() • _AlwaysRun() • _AppMon() • _AppMonEx() • _ArrayFilter/_ArrayReduce • _BinaryBin() • _CheckMsgBox() • _CmdLineRaw() • _ContextMenu() • _ConvertLHWebColor()/_ConvertSHWebColor() • _DesktopDimensions() • _DisplayPassword() • _DotNet_Load()/_DotNet_Unload() • _Fibonacci() • _FileCompare() • _FileCompareContents() • _FileNameByHandle() • _FilePrefix/SRE() • _FindInFile() • _GetBackgroundColor()/_SetBackgroundColor() • _GetConrolID() • _GetCtrlClass() • _GetDirectoryFormat() • _GetDriveMediaType() • _GetFilename()/_GetFilenameExt() • _GetHardwareID() • _GetIP() • _GetIP_Country() • _GetOSLanguage() • _GetSavedSource() • _GetStringSize() • _GetSystemPaths() • _GetURLImage() • _GIFImage() • _GoogleWeather() • _GUICtrlCreateGroup() • _GUICtrlListBox_CreateArray() • _GUICtrlListView_CreateArray() • _GUICtrlListView_SaveCSV() • _GUICtrlListView_SaveHTML() • _GUICtrlListView_SaveTxt() • _GUICtrlListView_SaveXML() • _GUICtrlMenu_Recent() • _GUICtrlMenu_SetItemImage() • _GUICtrlTreeView_CreateArray() • _GUIDisable() • _GUIImageList_SetIconFromHandle() • _GUIRegisterMsg() • _GUISetIcon() • _Icon_Clear()/_Icon_Set() • _IdleTime() • _InetGet() • _InetGetGUI() • _InetGetProgress() • _IPDetails() • _IsFileOlder() • _IsGUID() • _IsHex() • _IsPalindrome() • _IsRegKey() • _IsStringRegExp() • _IsSystemDrive() • _IsUPX() • _IsValidType() • _IsWebColor() • _Language() • _Log() • _MicrosoftInternetConnectivity() • _MSDNDataType() • _PathFull/GetRelative/Split() • _PathSplitEx() • _PrintFromArray() • _ProgressSetMarquee() • _ReDim() • _RockPaperScissors()/_RockPaperScissorsLizardSpock() • _ScrollingCredits • _SelfDelete() • _SelfRename() • _SelfUpdate() • _SendTo() • _ShellAll() • _ShellFile() • _ShellFolder() • _SingletonHWID() • _SingletonPID() • _Startup() • _StringCompact() • _StringIsValid() • _StringRegExpMetaCharacters() • _StringReplaceWholeWord() • _StringStripChars() • _Temperature() • _TrialPeriod() • _UKToUSDate()/_USToUKDate() • _WinAPI_Create_CTL_CODE() • _WinAPI_CreateGUID() • _WMIDateStringToDate()/_DateToWMIDateString() • Au3 script parsing • AutoIt Search • AutoIt3 Portable • AutoIt3WrapperToPragma • AutoItWinGetTitle()/AutoItWinSetTitle() • Coding • DirToHTML5 • FileInstallr • FileReadLastChars() • GeoIP database • GUI - Only Close Button • GUI Examples • GUICtrlDeleteImage() • GUICtrlGetBkColor() • GUICtrlGetStyle() • GUIEvents • GUIGetBkColor() • Int_Parse() & Int_TryParse() • IsISBN() • LockFile() • Mapping CtrlIDs • OOP in AutoIt • ParseHeadersToSciTE() • PasswordValid • PasteBin • Posts Per Day • PreExpand • Protect Globals • Queue() • Resource Update • ResourcesEx • SciTE Jump • Settings INI • SHELLHOOK • Shunting-Yard • Signature Creator • Stack() • Stopwatch() • StringAddLF()/StringStripLF() • StringEOLToCRLF() • VSCROLL • WM_COPYDATA • More Examples... Updated: 22/04/2018
Yashied Posted January 12, 2015 Author Posted January 12, 2015 (edited) I've decided to experiment and wrote a version of this function by using threads (up to 4). Yes, it reduced the time to perform external function, but unfortunately most of the time consuming _GDIPlus... function. Nevertheless, if anyone is interested here is a function. expandcollapse popup#Include <GDIPlus.au3> If StringRegExpReplace(@AutoItVersion, '(?<!\d)(\d)(?!\d)', '0\1') < '03.03.12.00' Then MsgBox(16, 'Error', 'Require AutoIt 3.3.12.0 or later.') EndIf _GDIPlus_Startup() $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Image.png') $hAlpha = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Alpha.png') $hResult = _GDIPlus_BitmapCreateBitmapWithAlpha($hBitmap, $hAlpha, 1) _GDIPlus_ImageSaveToFile($hResult, @ScriptDir & '\Image+Alpha.png') _GDIPlus_BitmapDispose($hResult) _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_BitmapDispose($hAlpha) _GDIPlus_Shutdown() Func _GDIPlus_BitmapCreateBitmapWithAlpha($hBitmap, $hAlpha, $iChannel = 0) Local $hGraphics, $hBmp[2], $hThread, $iThread, $tParams, $bProc, $tProc, $pProc, $aSize1, $aSize2, $aLength, $iLength, $iOffset, $aResult Local $tData[2] = [$GDIP_ILMWRITE, $GDIP_ILMREAD] $aSize1 = DllCall($__g_hGDIPDll, 'uint', 'GdipGetImageDimension', 'handle', $hBitmap, 'float*', 0, 'float*', 0) If (@Error) Or ($aSize1[0]) Then Return 0 EndIf $aSize2 = DllCall($__g_hGDIPDll, 'uint', 'GdipGetImageDimension', 'handle', $hAlpha, 'float*', 0, 'float*', 0) If (@Error) Or ($aSize2[0]) Then Return 0 EndIf $hBmp[0] = _GDIPlus_BitmapCloneArea($hBitmap, 0, 0, $aSize1[2], $aSize1[3], $GDIP_PXF32ARGB) If ($aSize1[2] = $aSize2[2]) And ($aSize1[3] = $aSize2[3]) Then $hBmp[1] = $hAlpha Else $hBmp[1] = _GDIPlus_BitmapCreateFromScan0($aSize1[2], $aSize1[3], $GDIP_PXF32ARGB) $hGraphics = _GDIPlus_ImageGetGraphicsContext($hBmp[1]) _GDIPlus_GraphicsClear($hGraphics, 0) _GDIPlus_GraphicsDrawImageRect($hGraphics, $hAlpha, 0, 0, $aSize1[2], $aSize1[3]) _GDIPlus_GraphicsDispose($hGraphics) EndIf If ($iChannel < 0) Or ($iChannel > 3) Then $iChannel = 0 EndIf For $i = 0 To 1 $tData[$i] = _GDIPlus_BitmapLockBits($hBmp[$i], 0, 0, $aSize1[2], $aSize1[3], $tData[$i], $GDIP_PXF32ARGB) Next If @AutoItX64 Then $bProc = Binary('0x48894C24085541574831C0505050504883EC28488B6C246048837D000074054831C0EB0748C7C0010000004821C00F8591000000488B6C246048837D080074054831C0EB0748C7C0010000004821C07561488B6C2460837D100074054831C0EB0748C7C0010000004821C07532488B6C24604C637D144D21FF7C11488B6C24604C637D144983FF037F02EB0948C7C001000000EB034831C04821C07502EB0948C7C001000000EB034831C04821C07502EB0948C7C001000000EB034831C04821C07502EB0948C7C001000000EB034831C04821C0740B4831C04863C0E9A5000000488B6C24604C8B7D004983C7034C897C2428488B6C24604C8B7D08488B6C2460486345144929C74983C7034C897C243048C744243800000000488B6C24604C637D1049FFCF4C3B7C24387C4A488B6C24284C0FB67D00488B6C2430480FB645004C0FAFF84C89F848C7C1FF000000489948F7F94989C74C89F850488B6C24305888450048834424280448834424300448FF44243871A348C7C0010000004863C0EB034831C04883C448415F5DC3') Else $bProc = Binary('0x555331C05050508B6C2418837D0000740431C0EB05B80100000021C075748B6C2418837D0400740431C0EB05B80100000021C0754E8B6C2418837D0800740431C0EB05B80100000021C075288B6C24188B5D0C21DB7C0E8B6C24188B5D0C83FB037F02EB07B801000000EB0231C021C07502EB07B801000000EB0231C021C07502EB07B801000000EB0231C021C07502EB07B801000000EB0231C021C0740431C0EB778B6C24188B5D0083C303891C248B6C24188B5D048B6C24182B5D0C83C303895C2404C7442408000000008B6C24188B5D084B3B5C24087C368B2C240FB65D008B6C24040FB645000FAFD889D8B9FF00000099F7F989C3538B6C240458884500830424048344240404FF44240871BCB801000000EB0231C083C40C5B5DC20400') EndIf $iLength = BinaryLen($bProc) $pProc = DllCall('kernel32.dll', 'ptr', 'VirtualAlloc', 'ptr', 0, 'ulong_ptr', $iLength, 'dword', 0x1000, 'dword', 0x0040) $tProc = DllStructCreate('byte[' & $iLength & ']', $pProc[0]) DllStructSetData($tProc, 1, $bProc) $iLength = $aSize1[2] * $aSize1[3] Select Case $iLength > 2 ^ 24 $iThread = 4 Case $iLength > 2 ^ 20 $iThread = 2 Case Else $iThread = 1 EndSelect Dim $aLength[$iThread] Dim $tParams[$iThread] Dim $hThread[$iThread] If $iThread = 1 Then $aLength[0] = $iLength Else $aLength[0] = Floor($iLength / $iThread) $aLength[$iThread - 1] = $iLength - $aLength[0] * ($iThread - 1) For $i = 1 To $iThread - 2 $aLength[$i] = $aLength[0] Next EndIf $iOffset = 0 For $i = 0 To $iThread - 1 $tParams[$i] = DllStructCreate('ptr;ptr;uint;uint') DllStructSetData($tParams[$i], 1, $tData[0].Scan0 + $iOffset) DllStructSetData($tParams[$i], 2, $tData[1].Scan0 + $iOffset) DllStructSetData($tParams[$i], 3, $aLength[$i]) DllStructSetData($tParams[$i], 4, $iChannel) $iOffset+= 4 * $aLength[$i] $aResult = DllCall('kernel32.dll', 'handle', 'CreateThread', 'ptr', 0, 'dword_ptr', 0, 'ptr', $pProc[0], 'struct*', $tParams[$i], 'dword', 0, 'ptr', 0) If (Not @Error) And ($aResult[0]) Then $hThread[$i] = $aResult[0] Else $hThread[$i] = 0 EndIf Next While 1 $iLength = 0 For $i = 0 To $iThread - 1 If $hThread[$i] Then $aResult = DllCall('kernel32.dll', 'bool', 'GetExitCodeThread', 'handle', $hThread[$i], 'dword*', 0) If (@Error) Or (Not $aResult[0]) Or ($aResult[2] <> 259) Then DllCall('kernel32.dll', 'bool', 'CloseHandle', 'handle', $hThread[$i]) $hThread[$i] = 0 Else $iLength += 1 EndIf EndIf Next If Not $iLength Then ExitLoop EndIf WEnd $aResult = DllCall('kernel32.dll', 'int', 'VirtualFree', 'ptr', $pProc[0], 'ulong_ptr', 0, 'dword', 0x4000) If (@Error) Or (Not $aResult[0]) Then ; Nothing EndIf For $i = 0 To 1 _GDIPlus_BitmapUnlockBits($hBmp[$i], $tData[$i]) Next If $hBmp[1] <> $hAlpha Then _GDIPlus_BitmapDispose($hBmp[1]) EndIf Return $hBmp[0] EndFunc ;==>_GDIPlus_BitmapCreateBitmapWithAlpha Edited January 13, 2015 by Yashied My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
Yashied Posted January 13, 2015 Author Posted January 13, 2015 The code has been changed. My UDFs: iKey | FTP Uploader | Battery Checker | Boot Manager | Font Viewer | UDF Keyword Manager | Run Dialog Replacement | USBProtect | 3D Axis | Calculator | Sleep | iSwitcher | TM | NetHelper | File Types Manager | Control Viewer | SynFolders | DLL Helper Animated Tray Icons UDF Library | Hotkeys UDF Library | Hotkeys Input Control UDF Library | Caret Shape UDF Library | Context Help UDF Library | Most Recently Used List UDF Library | Icons UDF Library | FTP UDF Library | Script Communications UDF Library | Color Chooser UDF Library | Color Picker Control UDF Library | IPHelper (Vista/7) UDF Library | WinAPI Extended UDF Library | WinAPIVhd UDF Library | Icon Chooser UDF Library | Copy UDF Library | Restart UDF Library | Event Log UDF Library | NotifyBox UDF Library | Pop-up Windows UDF Library | TVExplorer UDF Library | GuiHotKey UDF Library | GuiSysLink UDF Library | Package UDF Library | Skin UDF Library | AITray UDF Library | RDC UDF Library Appropriate path | Button text color | Gaussian random numbers | Header's styles (Vista/7) | ICON resource enumeration | Menu & INI | Tabbed string size | Tab's skin | Pop-up circular menu | Progress Bar without animation (Vista/7) | Registry export | Registry path jumping | Unique hardware ID | Windows alignment More...
UEZ Posted February 26, 2015 Posted February 26, 2015 (edited) I added an experimental ASM version: expandcollapse popup#Include <GDIPlus.au3> If StringRegExpReplace(@AutoItVersion, '(?<!\d)(\d)(?!\d)', '0\1') < '03.03.12.00' Then MsgBox(16, 'Error', 'Require AutoIt 3.3.12.0 or later.') EndIf If FileExists(@ScriptDir & '\Image+AlphaASM.png') Then FileDelete(@ScriptDir & '\Image+AlphaASM.png') _GDIPlus_Startup() $hBitmap = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Image.png') $hAlpha = _GDIPlus_BitmapCreateFromFile(@ScriptDir & '\Alpha.png') _GDIPlus_BitmapCreateBitmapWithAlphaASM($hBitmap, $hAlpha) _GDIPlus_ImageSaveToFile($hBitmap, @ScriptDir & '\Image+AlphaASM.png') _GDIPlus_BitmapDispose($hBitmap) _GDIPlus_BitmapDispose($hAlpha) _GDIPlus_Shutdown() ShellExecute(@ScriptDir & '\Image+AlphaASM.png') Func _GDIPlus_BitmapCreateBitmapWithAlphaASM($hBitmap, $hBitmap_AlphaMask) ;coded by UEZ build 2015-02-26 Local $fTimer_All = TimerInit() Local Const $iWidth = _GDIPlus_ImageGetWidth($hBitmap), $iHeight = _GDIPlus_ImageGetHeight($hBitmap) If _GDIPlus_ImageGetWidth($hBitmap_AlphaMask) <> $iWidth Or _GDIPlus_ImageGetHeight($hBitmap) <> $iHeight Then Return SetError(1, 0, 0) Local Const $tBitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $iWidth, $iHeight, BitOR($GDIP_ILMREAD, $GDIP_ILMWRITE), $GDIP_PXF32ARGB) Local Const $pScan = $tBitmapData.Scan0 Local Const $iStride = $tBitmapData.Stride Local Const $tPixelData = DllStructCreate("dword[" & (Abs($iStride * $iHeight)) & "]", $pScan) Local Const $tBitmapAlphaMaskData = _GDIPlus_BitmapLockBits($hBitmap_AlphaMask, 0, 0, $iWidth, $iHeight, $GDIP_ILMREAD, $GDIP_PXF32RGB) Local Const $pScanAlpha = $tBitmapAlphaMaskData.Scan0 Local Const $iStrideAlpha = $tBitmapAlphaMaskData.Stride Local Const $tPixelAlphaMaskData = DllStructCreate("dword[" & (Abs($iStrideAlpha * $iHeight)) & "]", $pScanAlpha) Local $fTimer_ASM = TimerInit() Local $tCodeBuffer = DllStructCreate("byte ASM[46]") $tCodeBuffer.ASM = "0x8B7424048B4C24088B7C240C8B0625FFFFFF008B1F81E30000FF00C1E30809D8890683C60483C70483E90177DFC3" DllCall("user32.dll", "ptr", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), _ "ptr", DllStructGetPtr($tPixelData), _ "int", $iWidth * $iHeight , _ "ptr", DllStructGetPtr($tPixelAlphaMaskData), "int",0) ConsoleWrite("ASM: " & TimerDiff($fTimer_ASM) & " ms." & @CRLF) _GDIPlus_BitmapUnlockBits($hBitmap, $tBitmapData) _GDIPlus_BitmapUnlockBits($hBitmap_AlphaMask, $tBitmapData) ConsoleWrite("Overall: " & TimerDiff($fTimer_All) & " ms." & @CRLF) Return 1 EndFunc #cs ASM .data:0x00000000 8b742404 mov esi,DWORD PTR [esp+0x4] ;start address of the bitmap .data:0x00000004 8b4c2408 mov ecx,DWORD PTR [esp+0x8] ;number of pixel -> $iWidth * $iHeight .data:0x00000008 8b7c240c mov edi,DWORD PTR [esp+0xc] ;start address of the alpha mask bitmap .data:0x0000000c .data:0x0000000c loc_0000000c: ┏▶ .data:0x0000000c 8b06 mov eax,DWORD PTR [esi] ;get the pixel from the bitmap ┃ .data:0x0000000e 25ffffff00 and eax,0xffffff ;remove alpha channel ┃ .data:0x00000013 8b1f mov ebx,DWORD PTR [edi] ;get the pixel from alpha mask bitmap ┃ .data:0x00000015 81e30000ff00 and ebx,0xff0000 ;get red value only because r=g=b (greyscale). This will be our alpha channel ┃ .data:0x0000001b c1e308 shl ebx,0x8 ;shift the value to the alpha channel place AArrggbb ┃ .data:0x0000001e 09d8 or eax,ebx ;add the alpha channel value to the bitmap pixel ┃ .data:0x00000020 8906 mov DWORD PTR [esi],eax ;write the pixel to the bitmap -> should be a greyscaled color value ┃ .data:0x00000022 83c604 add esi,0x4 ;address next pixel: 3 Byte = 1 dword = 1 Pixel ┃ .data:0x00000025 83c704 add edi,0x4 ;address next pixel: 3 Byte = 1 dword = 1 Pixel ┃ .data:0x00000028 83e901 sub ecx,0x1 ;counter (next pixel) ┗ .data:0x0000002b 77df ja loc_0000000c ;jump as long as counter is not zero .data:0x0000002d c3 ret My results for the images on op:ASM: 0.196242006627889 ms.Overall: 8.97499269224327 ms. Maybe a MMX/SSE and/or 64-bit version(s) will follow... Br,UEZ Edited February 27, 2015 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!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ
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