Autor Beitrag
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 29.06.07 10:21 
Hallo,

ich hab gerade folgendes Problem: ich hab ein Bild (liegt in einem TBitmap32 vor) von dem ich weis daß es Text enthält. Ich kenne sogar die Bild-Koordinaten des Rechtecks, das den Text enthält.
Nun möchte ich diesen Text highlighten indem ich das zugehörige obige Rechteck immer Hellgrün zeichne und den Text immer weiß (wie die Suche im FireFox)

Hat jemand eine Idee, was für ein Bild ich mit welchen Einstellungen auf das Originalbild kopieren muß um den Effekt zu erhalten? Oder muß man einen ganz anderen Ansatz wählen?

Meine bisherigen Versuche schaffen es zwar, den Text zu highlighten, aber die Hintergrundfarbe und Textfarbe ändern sich je nach Ausgangsfarben:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TPaInkRenderer.PaintTextSearchArea(const AHit: TPaPDFSearchResult;
  const AScaleX, AScaleY: double; const AColor: TColor);
var
  i: Integer;
  rArea: TRect;
  drResult: TDoubleRect;
  imgHit: TBitMap32;
begin
  for i := Low(AHit.HitAreas) to High(AHit.HitAreas) do
  begin
    imgHit := TBitmap32.Create;
    try
      drResult := AHit.HitAreas[i];
  
      rArea := Rect(Round5(drResult.Left * AScaleX), Round5(drResult.Top * AScaleY),
        Round5(drResult.Right * AScaleX), Round5(drResult.Bottom * AScaleY));

      imgHit.SetSize(RectWidth(rArea), RectHeight(rArea));
      imgHit.Clear(AColor);

      // FImage is das Bild, das den Text enthaelt  
      BitBlt(FImage.Handle, rArea.Left, rArea.Top, imgHit.Width, imgHit.Height,
        imgHit.Handle, 0, 0, DSTINVERT or SRCAND);
    finally
      imgHit.Free;
    end;
  end;
end;


Grüße,
Uli
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Fr 29.06.07 12:02 
Zeige mal ein solches typisches Bild. Du musst Vordergrund und Hintergrund irgendwie erkennen.

Dazu sind Infos wie entsteht das Bild sehr hilfreich. Nur mit einfachem AND,XOR,OR wird es nicht gehen.
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 29.06.07 13:30 
Hier mal ein Beispiel. Ich bekomme innerhalb der blau eingeringelten Bereiche die Koordinaten des Rechtecks, das das Wort 'largest' enthält. Und ich will nun die einzelnen Wörter hervorheben.
Das Problem ist, ich kann nicht davon ausgehen, daß ich immer schwarze Schrift auf weissem Hintergrund hab (es wird zwar oft so sein, aber halt nicht immer). Es kann im Prinzip jede beliebige Schriftfarbe auf einem beliebigen Hintergrund sein :-(

Grüße,
Uli
Einloggen, um Attachments anzusehen!
kkausp
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 77
Erhaltene Danke: 1

W2K, WIN XP, WIN XPe; WIN7
(D1;D2;D5;) D6 Ent.; D2009 Ent.
BeitragVerfasst: Fr 29.06.07 14:14 
Folgende Annahmen:
1. Die Schrift hat im rechteck eine beliebeige Konstante Farbe.
2. Auf dem Rand des Rechtecks gibt keine Schriftpixel (so gut wie keine).

Folgende Idee:

Histogramme der Farben des Rechtecks und des Randes Erstellen und normieren.

Vom Histogramm des Rechteckes das Histogramm des Randes abziehen.

Jetzt müsste das Maximum des Differenz-Histogramms auf die Farbe der Schrift zeigen.

Jetzt im Recht alle Pixel mit Schriftfarbe auf weiß setzen und alle anderen auf hellgrün.

Das Histogramm sollte nicht unbedingt die Helligkeit sein, sondern eher ein Farbabstand
uko Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 29.06.07 14:25 
Danke für den Tip. Ich werd die nächsten Tage schauen, was ich daraus machen kann.

Grüße,
Uli