Enforcer Posted December 4, 2009 Share Posted December 4, 2009 Hello everyone. I'm truing to create simple map converter for my game, but I did't find eny examples, or at least functions, that allow Pixel search from bitmap. Only this: PixelSearch ( left, top, right, bottom, color [, shade-variation [, step [, hwnd]]] ) But this isn't what I need. I don't wnat to create eny window. Simple: load bitmap, search black pixels and write their positions in to the text file. Maybe somehow with GDI Plus UDF ?... Eny Ideas how to do this ? ====== And sorry for my English [RU] Zone Link to comment Share on other sites More sharing options...
AndyG Posted December 4, 2009 Share Posted December 4, 2009 (edited) Hi, quick and dirty.... expandcollapse popup#include <GUIConstantsEx.au3> #include <WinAPI.au3> #include <GDIPlus.au3> #include <GDIPlusConstants.au3> #include <StructureConstants.au3> #include <Array.au3> $bitmapfile = "pic2.bmp" ;some image with black pixels $t = TimerInit() $array = _blackpixel2array_file($bitmapfile, "test.txt") ;write pixelcolours from an image-file into an array and black pixel koordinates into a file $m = TimerDiff($t) ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $m = ' & $m & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console Func _blackpixel2array_file($bmpfile, $textfile) ;returns a 2d array with the colours BGR _GDIPlus_Startup() $hfile = FileOpen($textfile, 2) $pBitmap = _GDIPlus_BitmapCreateFromFile($bmpfile) If @error Then MsgBox(0, "", "Fehler BitmapCreateFromFile") ;_GDIPlus_BitmapLockBits gibt $tagGDIPBITMAPDATA-Struktur zurück $BitmapData = _GDIPlus_BitmapLockBits($pBitmap, 0, 0, _GDIPlus_ImageGetWidth($pBitmap), _GDIPlus_ImageGetHeight($pBitmap), $GDIP_ILMREAD, $GDIP_PXF24RGB) If @error Then MsgBox(0, "", "Error locking region " & @error) $stride = DllStructGetData($BitmapData, "Stride");Stride - Offset, in bytes, between consecutive scan lines of the bitmap. If the stride is positive, the bitmap is top-down. If the stride is negative, the bitmap is bottom-up. $Width = DllStructGetData($BitmapData, "Width");Image width - Number of pixels in one scan line of the bitmap. $Height = DllStructGetData($BitmapData, "Height");Image height - Number of scan lines in the bitmap. ;$pixelFormat = DllStructGetData($BitmapData, "PixelFormat");Pixel format - Integer that specifies the pixel format of the bitmap $Scan0 = DllStructGetData($BitmapData, "Scan0");Scan0 - Pointer to the first (index 0) scan line of the bitmap. $pixeldata = DllStructCreate("byte[" & (Abs($stride) * ($Height)) & "]", $Scan0) $BMPData = StringTrimLeft(DllStructGetData($pixeldata, 1), 2) ;string im Struct-format, d.h. Byte+nulByte, in dem die pixeldaten im BGR-Format stehen Dim $array[$Height + 1][$Width + 1] For $y = 0 To $Height - 1 ;to 1 step -1 ;bottomup bitmap, first line in image is last line in data For $i = 0 To $stride * 2 Step 6 ;every 3 byte are one pixel $array[$y + 1][$i / 6] = StringMid($BMPData, ($y * $stride * 2) + $i + 1, 6) ;colour of the pixel into Array[x][y] with x and y are the koordinates If $array[$y + 1][$i / 6] = "000000" Then FileWriteLine($hfile, $i / 6+1 & ";" & $y + 1) ;if colour is black, write x and y-coordinates into file Next Next ; _arraydisplay($array) FileClose($hfile) $BMPDataStart = "" $pixeldata = 0 _GDIPlus_BitmapUnlockBits($pBitmap, $BitmapData) _GDIPlus_ImageDispose($pBitmap) _WinAPI_DeleteObject($pBitmap) _GDIPlus_Shutdown() Return $array EndFunc ;==>_blackpixel2array_file There are very fast solutions in several dll´s. If you need a faster script, i´ll do my very best^^ /*EDIT*/ coordinates in file correct now Edited December 4, 2009 by AndyG Link to comment Share on other sites More sharing options...
Enforcer Posted December 4, 2009 Author Share Posted December 4, 2009 Thanx for Great Example THIS WILL REALY HELP !!! =)Verry good Example Works PERFECT ! [RU] Zone 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