Seite 2 von 3

Verfasst: 25.01.2009 03:03
von R4z0r1989
ne eher auf ner page wo sich links immer verändern, und ich an dem rechner eh nie wär, ne gute alternative darstellt!

Verfasst: 25.01.2009 03:08
von Kaeru Gaman
satzbau unklar!

also doch veränderungen?

das einfachste um ne veränderung zu finden, ist vorher und nachher screenshot übereinander zu legen mit XOR.
dort wo sich was verändert hat ist die einzige stelle wo pixel übrigbleiben.

Verfasst: 25.01.2009 03:10
von R4z0r1989
nein der link ändert sich zwar aber z.B. steht wo man drauf drückt immer noch "Gesamtprofil anzeigen" den link sieht man praktisch nicht auf dem bildschirm

Verfasst: 25.01.2009 03:23
von Kaeru Gaman
ich kann mir immer noch nix drunter vorstellen.

ich hoffe, dass dir der vorher beschriebene ansatz hilft.
(screenshot; bitmap per API durchsuchen, z.b. BitBlt; zuerst nur nach einem pixel suchen)

wenn nicht, musst du wesentlich genauer beschreiben, was du eigentlich tun willst.

Verfasst: 25.01.2009 03:27
von KeyKon
Ich hab inzwischen verstanden was er will, hab jetz aber auch keinen Lösungsansatz parat...
Ich versuchs nochmal zu erklären:

Er hat ein kleines Bild von einem Button (Nehm ich ma an)
Nun macht er einen Screenshot und jetz soll ermittelt werden auf welchen Koordinaten dieses Bild von dem Button ist (um dort einen Mausklick zu simulieren nehm ich an)

Verfasst: 25.01.2009 03:31
von Kaeru Gaman
ja so hatte ich das auch erst verstanden.
ob button oder icon ist ja banane.
hätte er ja ruhig sagen können.

also, dafür hab ich ja ansätze genannt, jetz muss er sich nur noch die
entsprechende API-Funktion für direktzugriff aufn Image raussuchen.

Verfasst: 25.01.2009 03:46
von R4z0r1989
naja darauf erhoff ich mir ja nenn ansatz mir soetwas nennen zu können ^^

also würd ich für diese apis funktionen erfreut sein...


danke im voraus

lg R4z0r1989

Verfasst: 25.01.2009 04:30
von KeyKon
Hier ein kleines Beispiel inkl Performancevergleich...

Code: Alles auswählen

CreateImage(0,1280,1024)

Procedure CopyImageToMem(Img.l, *mem)
  Protected bmi.BITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
 
  w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
 
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w
  bmi\bmiHeader\biHeight      =  h
  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    =  32
  bmi\bmiHeader\biCompression = #BI_RGB
 
  hDC = StartDrawing(ImageOutput(Img))
  If GetDIBits_(hDC, hBmp, 0, h, *mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    OpenConsole()
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure 


time = ElapsedMilliseconds()

wi = ImageWidth(0)
hi = ImageHeight(0)

*buffer = AllocateMemory(wi*hi*4)


Debug CopyImageToMem(0,*buffer)

*pos.LONG = *buffer

For y = 0 To hi-1
  For x = 0 To wi-1
    
    bgr = *pos\l
    red = Blue(bgr)
    green = Green(bgr)
    blue = Red(bgr)
      
    *pos   + 4
  Next 
Next 

Debug StrF((ElapsedMilliseconds()-time)/1000,3)

time = ElapsedMilliseconds()

StartDrawing(ImageOutput(0))
  For y = 0 To hi
    For x = 0 To wi
      rgb = Point(x,y)
      red = Red(rgb)
      green = Green(rgb)
      blue = Blue(rgb)
    Next
  Next
StopDrawing()


Debug StrF((ElapsedMilliseconds()-time)/1000,3)
Bei mir braucht Point() ca 15 mal so lange wie der direkte Zugriff...

Verfasst: 25.01.2009 18:33
von R4z0r1989
ich glaub nicht dass es funktionieren wird wenn ich mir das Bild ("C:/test.bmp") so ansehe

Code: Alles auswählen

CreateImage(0,GetSystemMetrics_(#SM_CXSCREEN),GetSystemMetrics_(#SM_CYSCREEN))

Procedure CopyImageToMem(Img.l, *mem)
  Protected bmi.BITMAPINFO
  Protected w.l, h.l, hBmp.l, hDC.l
 
  w = ImageWidth(Img)
  h = ImageHeight(Img)
  hBmp = ImageID(Img)
 
  bmi\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER)
  bmi\bmiHeader\biWidth       =  w
  bmi\bmiHeader\biHeight      =  h
  bmi\bmiHeader\biPlanes      =  1
  bmi\bmiHeader\biBitCount    =  32
  bmi\bmiHeader\biCompression = #BI_RGB
 
  hDC = StartDrawing(ImageOutput(Img))
  If GetDIBits_(hDC, hBmp, 0, h, *mem, bmi, #DIB_RGB_COLORS)
    StopDrawing()
    ProcedureReturn #True
  Else
    OpenConsole()
    StopDrawing()
    ProcedureReturn #False
  EndIf
EndProcedure


time = ElapsedMilliseconds()

wi = ImageWidth(0)
hi = ImageHeight(0)

*buffer = AllocateMemory(wi*hi*4)


Debug CopyImageToMem(0,*buffer)
SaveImage(0,"C:/test.bmp")

*pos.LONG = *buffer

For y = 0 To hi-1
  For x = 0 To wi-1
  
    bgr = *pos\l
    red = Blue(bgr)
    green = Green(bgr)
    blue = Red(bgr)
     
    *pos   + 4
  Next
Next

Debug Str((ElapsedMilliseconds()-time))

time = ElapsedMilliseconds()

StartDrawing(ImageOutput(0))
  For y = 0 To hi
    For x = 0 To wi
      rgb = Point(x,y)
      red = Red(rgb)
      green = Green(rgb)
      blue = Blue(rgb)
    Next
  Next
StopDrawing()


Debug Str((ElapsedMilliseconds()-time))
danke für hilfe im voraus

Edit:

Ich hab grad gesehen das mir die prozedure nicht den desktop ins bild legt, kann mir jemand in dieser hinsicht helfen?

Verfasst: 25.01.2009 19:44
von Kaeru Gaman
@KeyKon:

Performancetest mit Debuggerausgabe?

... du beliebst zu scherzen!