![]() |
Scanline: Punkt finden
Hi,
wie kann ich schnell via Scanline ein Bild nach einen roten Punkt durchsuchen und dann die Position von dessen herausfinden? MFG Lars Wiltfang |
Re: Scanline: Punkt finden
hi,
wenn du dir das hier auf deine Bedürfnisse umbaust, solltest du das herausbekommen. In dem Beispiel wird halt ein Pixel rot eingefärbt. mit kurzem überlegen dürfte das dann aber klappen: ![]() HTH Gruß Ansgar |
Re: Scanline: Punkt finden
Abgesehen davon muss man sich im Vorfeld überlegen, was ein "roter Punkt" eigentlich ist (Farb-Annäherung).
|
Re: Scanline: Punkt finden
Zitat:
|
Re: Scanline: Punkt finden
statt p^[3] etwas zuzuweisen, prüfst du halt die Farbwerte. Ich verstehe nicht wo dein problem ist, und "geht nicht" ist auch keine hinreichende Beschreibung (d)eines Problems
|
Re: Scanline: Punkt finden
Zitat:
|
Re: Scanline: Punkt finden
du musst erstmal das hier für dich klären
Zitat:
dann musst du doch einfach den Teil aus dem Tutorial, wo der wert zugewiesen wird umbauen und danach abfragen. Beispiel(ungetestet):
Delphi-Quellcode:
procedure TForm1.MakeRed(Bit: TBitmap);
type PixArray = array [1..3] of Byte; var p: ^PixArray; h,w: Integer; begin for h:=0 to Bit.Height-1 do begin p:= Bit.ScanLine[h]; for w:=0 to Bit.Width-1 do begin if (p^[3]=255) then begin showmessage('Juchhu!!! Zeile: ' + IntToStr(h) + ' Spalte ' + IntToStr(w)); end; Inc(p); end; end; end; [EDIT] 20mins... da kann man auch mal länger suchen ;) [edit 2] Zitat:
Delphi-Quellcode:
p^[1] // Entspricht dem Blau-Anteil
p^[2] // Entspricht dem Grün-Anteil p^[3] // Entspricht dem Rot-Anteil |
Re: Scanline: Punkt finden
Zitat:
|
Re: Scanline: Punkt finden
Hallo Lars,
versuch doch einmal heraus zu bekommen welche Werte Dein "roter" Stift hat. Zitat:
K-H |
Re: Scanline: Punkt finden
Das heißt also, rot ist nicht (nur) clRed. Ich würde es dann als "rot" bezeichnen, wenn die Grün- und Blauanteile recht niedrig, der Rotanteil aber ziemlich hoch ist. Wo man nun bei den beiden Begriffen "recht" und "ziemlich" aus dem vorherigen Satz die Grenze setzt, das ist die Kunst.
|
Re: Scanline: Punkt finden
Hier mal ein Versuch, nicht getestet.
Delphi-Quellcode:
{packed ist wichtig, sonst werden durch die Speicherausrichtung eventuell für jede Variable 4 Byte reserviert}
type PPixel24Bit = ^TPixel24Bit; TPixel24Bit = packed record Blue, Green, Red: Byte; end; procedure TFTest.MakeRed(Bit: TBitmap); const Schwellwert = 25; {willkürliche Festlegung ab wann ein Pixel als Rot gilt} var Merker: record d: Integer; x, y: Integer; end; p: PPixel24Bit; x, y: Integer; d1, d2, d: Integer; begin {Pixelformat muss hier pf24Bit sein, sonst stimmen die Werte nicht und es könnte sogar eine Zugriffsverletzung geben} Bit.Pixelformat := pf24Bit; Merker.d := 0; Merker.x := 0; Merker.y := 0; for y := 0 to Bit.Height - 1 do begin p := Bit.ScanLine[y]; for x := 0 to Bit.Width - 1 do begin {sehr vereinfachte Ermittlung wie stark der Rotanteil überwiegt, geht auch besser} d1 := p.red - p.blue; d2 := p.red - p.green; d := Min(d1, d2); {Pixel mit der höchsten Rotdifferenz merken} if d > Merker.d then begin Merker.d := d; Merker.x := x; Merker.y := y; end; Inc(p); end; end; if Merker.d > Schwellwert then ShowMessage(Format('Juchhu!!! Zeile: %d Spalte: %d', [Merker.y, Merker.x])); end; |
Re: Scanline: Punkt finden
Such hier im Forum mal nach HSL. Ggf. kannst du dir auch die Graphics32 anschauen. Für den Rest bitte das Gehirn einschalten.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz