Bild vergleichen!

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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)
(\/) (°,,,°) (\/)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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
Benutzeravatar
KeyKon
Beiträge: 1412
Registriert: 10.09.2004 20:51
Computerausstattung: Laptop: i5 2,8 Ghz, 16GB DDR3 RAM, GeForce 555GT 2GB VRAM
PC: i7 4,3 Ghz, 32GB DDR3 RAM, GeForce 680 GTX 4GB VRAM
Win10 x64 Home/Prof
PB 5.30 (64bit)
Wohnort: Ansbach
Kontaktdaten:

Beitrag 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...
(\/) (°,,,°) (\/)
Benutzeravatar
R4z0r1989
Beiträge: 521
Registriert: 12.06.2005 18:06
Kontaktdaten:

Beitrag 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?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@KeyKon:

Performancetest mit Debuggerausgabe?

... du beliebst zu scherzen!
Antworten