AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bild im Internet Explorer finden?

Ein Thema von gee21 · begonnen am 21. Mai 2013 · letzter Beitrag vom 29. Mai 2013
Antwort Antwort
Seite 2 von 3     12 3      
Perlsau
(Gast)

n/a Beiträge
 
#11

AW: Bild im Internet Explorer finden?

  Alt 21. Mai 2013, 19:27
Habe gerade mal etwas im Forum rumgeschaut und das einzige was ICH gefunden habe und evt für mich hilfreich SEIN KÖNNTE?
Bin eben noch ziemmlicher Anfänger und daher sind auch einfache Sachen für mich immer noch Schwierig zu realisieren.
Dazu möchte ich dir etwas sagen:

Es ist nicht empfehlenswert, als Anfänger gleich derart schwierige Unterfangen zu starten. Wenn du die oben beschriebene Aufgabe lösen möchtest, mußt du auch verstehen, wie der Code, den du dazu einzusetzen gedenkst, funktioniert. Daher stellt kopierter Kode, den du offensichtlich nicht verstehst, keine brauchbare Vorgehensweise dar. Auch bei Komponenten, die ja oft massenweise Code enthalten, der nicht immer auf Anhieb zu verstehen ist, mußt du zumindest wissen, wie die Komponente arbeitet, um sie sinnvoll einsetzen zu können. Einfach mal was kopieren und dann im Forum fragen, ob man das mit diesem Code machen könnte, stößt bei den meisten fortgeschrittenen Programmierern auf impulsive Ablehnung, weil du nämlich den Eindruck erweckst, du seist nur an einer Irgendwie-Lösung des Problems interessiert und nicht, wie man diese Lösung selbst entwickelt.

Die Hinweise mit dem Pixelmuster müßten eigentlich genügen, um diese Aufgabe lösen zu können. Weitere Hinweise wären ScanLine und die Überlegung, daß mit der jeweiligen Position des Männleins im IE ja vielleicht auch ein anderer Hintergrund-Ausschnitt verbunden ist. Ergo müßtest du den Hintergrund des Männleins erst einmal korrekt entfernen und dann im Bild danach suchen, wo sich das Männlein-Muster befinden könnte. Du mußt dazu einfach via Scanline die einzelnen Zeilen auf die Männlein-Farben testen. Findest du die erste Farbe sagen wir mal von der linken oberen Ecke des Männleins, dann prüfst du, ob die nächste Farbe mit dem zweiten Pixel des Männleins übereinstimmt usw. Studieren der Hilfe zu Scanline wird dich sicher weiterbringen, wenn du das möchtest.

Eine schnelle Erledigung der Aufgabe wirst du als "ziemlicher Anfänger" wohl nicht auf die Reihe bekommen, daher sind Geduld und Ausdauer angesagt. Das Resultat nennt man Fortschritt.
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#12

AW: Bild im Internet Explorer finden?

  Alt 21. Mai 2013, 20:01
OK, Danke für deine Info. Finde ich gut was du geschrieben hast. Da es auch ein ziemlich unwichtiges / FUN Projekt ist, wollte ich auch nur eine Irgendwie/schnelle/einfache Lösung. (Beim Mändlein ist übrigens immer der gleiche Hintergrund).

Wenn ich sehe wie einfach es ist, zwei "Gleich grosse" Bilder zu vergleichen kann es ja nicht so schwer sein ein Pixel Bereich in einem gesammten Bild zu finden.

Scanline habe ich mittlerweile auch entdeckt. Wie du aber richtig schreibst, verstehe ich es nicht. (Oder noch nicht)

werde mich mal schlau machen, üben und testen.

Danke
Robert
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Bild im Internet Explorer finden?

  Alt 24. Mai 2013, 21:14
So also. Habe mal etwas versucht. Leider klappt es absolut noch nicht richtig... (Aber immerhin schon ein wenig )


1.
Wenn ich den folgenden Code so ausführe, listet er mir zwar die Farbe der Pixel aus der 1. Zeile auf. Aber leider krieg ich am Schluss eine Fehlermeldung: Zugriffsverletzung Ntdll.dll.
Weitere Fehlermeldungen erhalte ich merkwürdigerweise wenn ich die Projekt.exe dann schliesse.

Weiss jemand was ich falsch mache?


2.
im Memo werden zuerst alle Farben so aufgeführt: $00F7F7F7
ein paar werden aber plötzlich so aufgeführt: clWhite
Warum denn das?




3.
Hier habe ich nun zum testen nur mit der 1. Zeile gearbeitet. trotzdem geht es relativ lange...(2-3 Sekunden) Ich vermute mal dass es bei einem Bild von 1680x1050 viel zu lange dauern würde alles SO auszulesen und dann noch nach einem gewissen Bereich zu suchen. Was kann man da machen?


Delphi-Quellcode:
var
Bild: TBitmap;
p: PBytearray;
zeile, spalte: integer;
r, g, b: byte;
begin

Bild:=form1.Image1.Picture.Bitmap;

//pf32 oder 24?
Bild.pixelformat := pf32Bit;

// Nur die erste Zeile auslesen (Als Test)
zeile:= 0;
// Später dann Alle Zeilen so auslesen? : for zeile := 0 to Bild.height do

//Alle Spalten / Pixel einer Zeile auslesen
for spalte := 0 to Bild.Width do begin;

//Zeiger auf Zeile setzen
p := Bild.scanline[zeile];

//Hier die 3 Farbwerte pro Pixel auslesen (Diesen Teil hab ich im Netz gefunden)
b := p[spalte * 4];
g := p[spalte * 4 + 1];
r := p[spalte * 4 + 2];

// Ab ins Memo als test und um später das gesuchte Teilbild per String zu suchen.
memo1.Lines.Add(ColorToString(rgb(r, g, b)));
end;
bild.free;
end;
Robert
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#14

AW: Bild im Internet Explorer finden?

  Alt 24. Mai 2013, 22:44
Hallo,

Zitat:
Wenn ich den folgenden Code so ausführe, listet er mir zwar die Farbe der Pixel aus der 1. Zeile auf. Aber leider krieg ich am Schluss eine Fehlermeldung: Zugriffsverletzung Ntdll.dll.
Weitere Fehlermeldungen erhalte ich merkwürdigerweise wenn ich die Projekt.exe dann schliesse.
Weiss jemand was ich falsch mache?
Lösche die Zeile bild.free nach Deiner For-Schleife.

Zitat:
im Memo werden zuerst alle Farben so aufgeführt: $00F7F7F7
ein paar werden aber plötzlich so aufgeführt: clWhite
Warum denn das?
Aus der OH
Zitat:
Mit ColorToString können Sie einen String abrufen [...] Wenn für die Farbe eine symbolische Konstante definiert ist [...], wird diese zurückgegeben. Andernfalls gibt ColorToString den hexadezimalen Wert der Farbe als String zurück

Zitat:
Hier habe ich nun zum testen nur mit der 1. Zeile gearbeitet. trotzdem geht es relativ lange...(2-3 Sekunden) Ich vermute mal dass es bei einem Bild von 1680x1050 viel zu lange dauern würde alles SO auszulesen und dann noch nach einem gewissen Bereich zu suchen. Was kann man da machen?
Vermutlich wird die meiste Zeit beim Einfügen ins und Aktualisieren des Memos verbraten.

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#15

AW: Bild im Internet Explorer finden?

  Alt 25. Mai 2013, 00:13
Neben den Punkten die Volker bereits aufgeführt hat greifst Du mit
Zitat:
0 to Bild.Width
schon 1 zu weit zu ...

Statt des ByteArray kannst Du eine Array of TRGBQuad verwenden

Delphi-Quellcode:
uses exgdi,exgdipapi,exgdipobj;
{$R *.dfm}
type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad;

....
var
 pscanLine32 : pRGBQuadArray;
 i,j:Integer;
 begin
   Bmp.PixelFormat := pf32Bit;
   for i := 0 to bmp.Height -1 do
     begin
     pscanLine32 := bmp.Scanline[i];
     for j := 0 to bmp.Width -1 do
        begin
          ... pscanLine32[j].rgbReserved ...
          ... pscanLine32[j].rgbBlue ...
          ... pscanLine32[j].rgbRed ...
          ... pscanLine32[j].rgbGreen ...
        end;
     end;
 end;
Der Umweg über String und ein Memo im besonderen werden das ganze extrem ausbremsen.

Ich würde den Vergleich direkt über die Scanlines machen

Pseudocodefetzen

Delphi-Quellcode:
  ...
  Pixelidentisch := true;
 
  //Loop über i/j Bild1 x/y Bild2 mit Abbruch wenn nicht Pixelidentisch
  //wenn x und y die Breite und Höhe erreicht haben und Pixelidentisch dann gefunden
  //das ganze dann jeweils mit erhöhten i und j Werten bis Pixelidentisch oder alles durchsucht
 
  Pixelidentisch := Pixelidentisch AND (Integer(pscanLineBitmap1[j]) = Integer(pscanLineBitmap2[x]));
  ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#16

AW: Bild im Internet Explorer finden?

  Alt 25. Mai 2013, 00:32
Hallo,

Zitat:
0 to Bild.Width
Zitat:
schon 1 zu weit zu ...
oha, mal wieder nur die hälfte gesehen

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#17

AW: Bild im Internet Explorer finden?

  Alt 25. Mai 2013, 23:36
Ich möchte mal einwerfen: mit Bei Google suchenOpenCV kann man Bildvergleiche mit schätzungsweise 10 Zeilen realisieren. Und nebenbei noch verschiedene Vergleichsalgoritmen aussuchen. Wenn ich mich noch recht entsinne ist sogar ein Beispiel dabei, was Teilbilder in Bildern sucht.
Delphi programming
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#18

AW: Bild im Internet Explorer finden?

  Alt 27. Mai 2013, 22:02
Top. Danke euch allen für die guten Infos.

Werde mal die nächsten paar Tage wieder weiter machen und eure Tipps ausprobieren. Mal schauen was sich so tut.
Robert
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#19

AW: Bild im Internet Explorer finden?

  Alt 28. Mai 2013, 20:11
Zitat:
Statt des ByteArray kannst Du eine Array of TRGBQuad verwenden
Der Umweg über String und ein Memo im besonderen werden das ganze extrem ausbremsen.
Ich würde den Vergleich direkt über die Scanlines machen

Hallo Bummi versuche gerade deine Vorschäge umzusetzen. Aber es hapert noch etwas.


- Wie rufe ich den hier die zusammengefasste Farbe ab und für was benutzt man die rgbReserved?
Zitat:
... pscanLine32[j].rgbReserved ...
... pscanLine32[j].rgbBlue ...
... pscanLine32[j].rgbRed ...
... pscanLine32[j].rgbGreen ...


- So möchte ich die beiden Pixel des gesamten 1. Bildes mit dem Ausschnitt des 2. Bildes vergleichen.
if pscanLineBILD[j] = pscanLineGesuchtesBILD[j] then .....

So geht's nicht. Ich vermute mal das ich eben zuerst die 3 RGB Farben zusammenfassen muss und dann diese vergleichen muss, oder?
habe es noch mit: RGB(r,g,b) versucht aber irgendwie geht das nicht




So siehts bei mir mom. aus:

Delphi-Quellcode:
var
 Bild: TBitmap;
 GesuchtesBild: TBitmap;
 p: PBytearray;
 zeile, spalte: integer;
 r, g, b: byte;
 pscanLineBILD : pRGBQuadArray;
 pscanLineGesuchtesBILD : pRGBQuadArray;
 i,i2,j,j2:Integer;
begin

Bild:=form1.Image1.Picture.Bitmap;
gesuchtesBild:=form1.Image2.Picture.Bitmap;

for i := 0 to Bild.Height -1 do
      begin
      pscanLineBILD := Bild.Scanline[i];
      for j := 0 to bild.Width -1 do
         begin

      b:= pscanLineBILD[j].rgbBlue;
      r:= pscanLineBILD[j].rgbRed;
      g:= pscanLineBILD[j].rgbGreen;
end;


 //Abfrage ob 1. Pixel des gesuchten Bildes übereinstimmt
if pscanLineBILD[j] = pscanLineGesuchtesBILD[0] then begin

//1. Pixel stimmt, also rest vergeleichen

for i := i to Bild.Height -1 do
      begin
      pscanLineBILD := Bild.Scanline[i];
      for j := j to bild.Width -1 do
         begin

      b:= pscanLineBILD[j].rgbBlue;
      r:= pscanLineBILD[j].rgbRed;
      g:= pscanLineBILD[j].rgbGreen;



 for i2 := 0 to gesuchtesBild.Height -1 do
      begin
      gesuchtesBild := gesuchtesBild.Scanline[i];
      for j2 := 0 to gesuchtesBild.Width -1 do
         begin

      b:= pscanLinegesuchtesBild[j].rgbBlue;
      r:= pscanLinegesuchtesBild[j].rgbRed;
      g:= pscanLinegesuchtesBild[j].rgbGreen;

      if pscanLineBILD[j] = pscanLineGesuchtesBILD[j] then abort; // Stimmt nicht mehr überein.... Daher Abbruch
      if pscanLineGesuchtesBILD[j] = gesuchtesbild.width then showmessage('1. Zeile stimmt überein');


end;
end;
end;
end;


end;


end;
end;


end;
Robert
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#20

AW: Bild im Internet Explorer finden?

  Alt 29. Mai 2013, 09:45
Ich hatte mir das so vorgestellt ....

Delphi-Quellcode:
type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad;

Function FindBitmap(Container,Find:TBitmap):TPoint;
var
 SclS,SclF:pRGBQuadArray;
 xc,yc:Integer;
 x,y:Integer;
 Found:Boolean;
begin
   Container.PixelFormat := pf32Bit;
   Find.PixelFormat := pf32Bit;
   Result.X := -1;
   Result.Y := -1;

   yc:=0;
   while (yc < (Container.Height-Find.Height - 1)) and (Result.X=-1) do
       begin
         xc:= 0;
         while (xc < (Container.Width-Find.Width - 1)) and (Result.X=-1) do
            begin
                y := 0;
                Found := true;
                while (y<Find.Height-1) and Found do
                  begin
                     x := 0;
                     SclF := Find.ScanLine[y];
                     SclS:= Container.ScanLine[yc+y];
                     while (x < Find.Width -1) and Found do
                        begin
                           Found := Integer(SclS[xc+x])=Integer(SclF[x]);
                        inc(x);
                        end;
                  inc(y);
                  end;
                if Found then
                  begin
                     Result.X := xc;
                     Result.Y := yc;
                  end;
            inc(xc);
            end;
       inc(yc);
       end;


end;

procedure TForm2.Button1Click(Sender: TObject);
var
 p:TPoint;
begin
  Image1.Canvas.Draw(140,140,image2.Picture.Bitmap); //Test bmp2 auf bmp malen um es finden zu können
  p := FindBitmap(Image1.Picture.Bitmap,Image2.Picture.Bitmap);
  Caption := Format('X: %d - Y: %d',[P.X,P.Y])
end;
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz