StAbb Posted September 16, 2008 Share Posted September 16, 2008 Hey guys, is there a way I can get the color of a pixel in a specified image location without having to open that image? Thanks! -Steve Link to comment Share on other sites More sharing options...
ofLight Posted September 16, 2008 Share Posted September 16, 2008 (edited) expandcollapse popup#include <Constants.au3> $test = _GetBMPPixel("C:\ofLight\Ball-Fullsize.bmp",150,150) MsgBox(0,"",$test) Func _GetBMPPixel($File,$X,$Y) $imagesize = _ImageGetSize($File) $imgwidth = $imagesize[0] $imgheight = $imagesize[1] $nofpixels = ($imgwidth+1) * ($imgheight+1) Dim $hInst, $hBmp, $hMemDC, $hwnd Opt("WinWaitDelay",1) AutoItWinSetTitle("_GetBMPPixel_Temp_Window") $hwnd = WinGetHandle("_GetBMPPixel_Temp_Window") $hInst = DllCall("user32.dll","int","GetWindowLong","hWnd",$hwnd, "int",$GWL_HINSTANCE) $hInst = $hInst[0] $hBmp = DllCall("user32.dll","hwnd","LoadImage","hwnd",$hInst,"str",$File,"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) $ret = DLLCall("gdi32.dll","int","GetPixel","int",$hMemDC,"int",$X,"int",$Y) $ret = Hex( $ret[0], 6) $ret = StringRight($ret,2) & StringMid($ret,3,2) & StringLeft($ret,2) DllCall("gdi32.dll", "int", "DeleteDC", "hwnd", $hMemDC) DllCall("gdi32.dll", "int", "DeleteObject", "hwnd", $hBmp) Return $ret EndFunc Func _ImageGetSize($sFile);SUB Function Local $sHeader = _FileReadAtOffsetHEX($sFile, 1, 24); Get header bytes Local $asIdent = StringSplit("FFD8 424D 89504E470D0A1A 4749463839 4749463837 4949 4D4D", " ") Local $anSize = "" For $i = 1 To $asIdent[0] If StringInStr($sHeader, $asIdent[$i]) = 1 Then Select Case $i = 2; BMP $anSize = _ImageGetSizeSimple($sHeader, 19, 23, 0) ExitLoop EndSelect EndIf Next If Not IsArray($anSize) Then SetError(1) Return ($anSize) EndFunc Func _FileReadAtOffsetHEX($sFile, $nOffset, $nBytes);SUB Function Local $hFile = FileOpen($sFile, 0) Local $sTempStr = "" FileRead($hFile, $nOffset - 1) For $i = $nOffset To $nOffset + $nBytes - 1 $sTempStr = $sTempStr & Hex(Asc(FileRead($hFile, 1)), 2) Next FileClose($hFile) Return ($sTempStr) EndFunc Func _ImageGetSizeSimple($sHeader, $nXoff, $nYoff, $nByteOrder);SUB Function Local $anSize[2] $anSize[0] = _Dec(StringMid($sHeader, $nXoff * 2 - 1, 4), $nByteOrder) $anSize[1] = _Dec(StringMid($sHeader, $nYoff * 2 - 1, 4), $nByteOrder) Return ($anSize) EndFunc Func _Dec($sHexStr, $nByteOrder);SUB Function If $nByteOrder Then Return (Dec($sHexStr)) Local $sTempStr = "" While StringLen($sHexStr) > 0 $sTempStr = $sTempStr & StringRight($sHexStr, 2) $sHexStr = StringTrimRight($sHexStr, 2) WEnd Return (Dec($sTempStr)) EndFunc EDIT: ripped out some useless stuff i didnt see when i transferred this from my source. Edited September 16, 2008 by ofLight There is always a butthead in the crowd, no matter how hard one tries to keep them out.......Volly Link to comment Share on other sites More sharing options...
StAbb Posted September 16, 2008 Author Share Posted September 16, 2008 Thanks a lot man! 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