randall Posted June 23, 2006 Share Posted June 23, 2006 I just used Simucal's extprop.au3and Larry's user32.dll and gdi32.dll exploiting code for finding the colour of a pixel hereexpandcollapse popup#include <ExtProp.au3> $szPicFile = ;-----> PUT THE NAME AND LOCATION OF THE BITMAP HERE HotKeySet("{ESC}", "Terminate") Func Terminate() FileClose($file) Exit 0 EndFunc ;==>Terminate ;-get last pixels $imgwidth = StringTrimRight(_GetExtProperty($szPicFile,27),7)-1 $imgheight = StringTrimRight(_GetExtProperty($szPicFile,28),7)-1 $nofpixels = ($imgwidth+1) * ($imgheight+1) ;-------------- ;-initialise Array Global $imgarray[$imgwidth+1][$imgheight+1] ;-open image Const $GWL_HINSTANCE = -6 Const $IMAGE_BITMAP = 0 Const $LR_LOADFROMFILE = 0x0010 Dim $hInst, $hBmp, $hMemDC, $hwnd Opt("WinWaitDelay",1) AutoItWinSetTitle("qqqqqq") $hwnd = WinGetHandle("qqqqqq") $hInst = DllCall("user32.dll","int","GetWindowLong","hWnd",$hwnd, "int",$GWL_HINSTANCE) $hInst = $hInst[0] $hBmp = DllCall("user32.dll","hwnd","LoadImage","hwnd",$hInst,"str",$szPicFile,"int",$IMAGE_BITMAP, _ "int",0,"int",0,"int",$LR_LOADFROMFILE) $hBmp = $hBmp[0] $hMemDC = DllCall("gdi32.dll", "int", "CreateCompatibleDC", "int", 0) $hMemDC = $hMemDC[0] DllCall("gdi32.dll", "hwnd", "SelectObject", "int", $hMemDC, "hwnd", $hBmp) ;------------------------------------- ;-get pixels and populate array ProgressOn("Progress Meter", "Copying Pixels into array") ; start progress bar For $y = 0 To Round($imgheight) Step 1 For $x = 0 To Round($imgwidth) Step 1 ;get pixel colour $ret = DLLCall("gdi32.dll","int","GetPixel","int",$hMemDC,"int",$x,"int",$y) ;x and y of pixel $ret = Hex( $ret[0], 6) $ret = StringRight($ret,2) & StringMid($ret,3,2) & StringLeft($ret,2) ;stick it in the array $imgarray[$x][$y] = $ret ProgressSet( ((($x+1)+($y*$imgwidth))/$nofpixels) * 100,Round((($x+1)+($y*$imgwidth))/1000) & " of " & Round($nofpixels/1000) & " thousands") Next Next ProgressSet(100 , "Done") ProgressOff() ;-close image DllCall("gdi32.dll", "int", "DeleteDC", "hwnd", $hMemDC) DllCall("gdi32.dll", "int", "DeleteObject", "hwnd", $hBmp) ;-------------------------------------Now, this is all very nice, and raw image processing can be done, and then the stuff can even be written back to BMP with evilertoaster's BMP library from this postThe problem however, is that both the solution i hacked and the one evilertoaster proposed are very slow.Mine takes minutes to load very large files into memory on an A64, and i think the same goes for evilertoaster's code.Is it maybe possible to use the BitBlt function in gdi32.dll to copy the whole image and then access it directly from memory by autoit, and maybe then also write it back to file in the same way. I think this may open new possibilities for doing image processing with autoit. Link to comment Share on other sites More sharing options...
Moderators SmOke_N Posted June 23, 2006 Moderators Share Posted June 23, 2006 If I'm not mistaken, Larry did use BitBlt for the new pixel Functions in beta (can't remember which one), but the current ones I'm fairly sure are using it. Common sense plays a role in the basics of understanding AutoIt... If you're lacking in that, do us all a favor, and step away from the computer. Link to comment Share on other sites More sharing options...
randall Posted June 23, 2006 Author Share Posted June 23, 2006 Larry did use BitBlt for the new pixel Functions in betaI think he knows how to do this sort of stuff, and if I was clever enough i could figure it out from his other work. The problem is that the stuff that has been done is geared towards loading and manipulating screen shots rather than image files, which is what i am trying to do 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