Zum Inhalt springen

[Delphi] Pixelfarbe überprüfen


need-some-blood

Empfohlene Beiträge

Hey.

folgendes Problem.

Möchte gerne das Pixel[2.2] eine Bitmaps auf die Farbe kontrollieren. Wenn die Farbe in dem Bereich Grün bis Rot ist, soll dies und das geschiehen. Das ganze geht doch mit Canvas.pixels[2,2].

Aber scheinbar mache ich was an der Abfrage falsch, nur was?

      if (imjpg.picture.bitmap.canvas.Pixels[2,2] in [$0000FF00..$000000FF]) then

          begin

           Anweisung

          end;

Fehlermeldung

[Fehler] mainframeunit.pas(148): Nicht genügend wirkliche Parameter

Wo liegt das Prob?

MVG

need-some-blood

Link zu diesem Kommentar
Auf anderen Seiten teilen

Eine Menge setzt sich aus mehreren Werten desselben ordinalen Typs zusammen. Die Werte haben keine feste Reihenfolge. Wenn ein Wert in einer Menge doppelt vorkommt, hat jedes Vorkommen dieselbe Bedeutung.

Der Bereich eines Mengentyps ist die Potenzmenge eines bestimmten Ordinaltyps, der als Basistyp bezeichnet wird. Die möglichen Werte eines Mengentyps sind Teilmengen des Basistyps, einschließlich der leeren Menge. Der Basistyp darf aus maximal 256 Werten bestehen. Die Ordinalpositionen der Werte müssen zwischen 0 und 255 liegen.

Denke mal, dass deine Farbangaben nicht hinhauen.

Vielleicht würde ja sowas hier gehen:



type

  TColors = set of TColor;

...

var

  FRed, FGreen: TColors;

  APixel: TColor;

...


FRed:= [$00000000..$0000FF00];

FGreen:= [$00000000..$000000FF];

...


APixel:= image.picture.bitmap.canvas[2,2];

if (APixel in FRed) OR (APixel in FGreen) then

begin


end;

EDIT:

Wobei TColor ja mehr als 256 Werte hat, aber so als Denkanstoss eben...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi, mit einer Menge wird das nichts, aber man kann eine "normale" Wertebereichsprüfung machen:



var 

  aColor: TColor;

  aCanvas: TCanvas;

begin

  aColor := aCanvas.Pixels[x,y];

  if (aColor > clRed) and (aColor < clGreen) then 

    TuWas;


Ich gaube nicht, dass folgender Code:
FRed:= [$00000000..$0000FF00];

zu gewünschtem Ergebnis führt, da in dieser Menge IMHO auch die Zahlen wie z.B. $00000001 oder $0000FEFF enthalten sein dürften.

Für die Farbe Grün wäre eine Teilmenge gesucht, in welcher die beiden niederwertigsten Bytes immer 0 wären und die Zahl nicht größer $0000FF00 wird.

Auszug aus der Delphi7 Hilfe:

Wenn Sie zur Festlegung von TColor nicht die Konstanten aus der Unit Graphics, sondern eine 4-Byte-Hexadezimalzahl verwenden, geben die drei niederwertigen Bytes die RGB-Farbintensität für Blau, Grün und Rot an. Der Wert $00FF0000 (Delphi) bzw. 0x00FF0000 (C++) entspricht einem reinen Blau mit voller Intensität, der Wert $0000FF00 (Delphi) bzw. 0x0000FF00 (C++) einem reinen Grün und der Wert $000000FF (Delphi) bzw. 0x000000FF (C++) einem reinen Rot. $00000000 (Delphi) bzw. 0x00000000 (C++) gibt Schwarz und $00FFFFFF (Delphi) bzw. 0x00FFFFFF (C++) Weiß an.

Im Anhang ein kleines Demo mit Quelltext.

TinCan_Canvas_Demo.zip

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok, das mit den 256 Werten verstehe ich. Werde dies auch nicht so lösen. Wäre natürlich ne schön elegante option gewesen

Mal ne weiterführende Frage dazu.

Müsste die Fehlermeldung nicht heißen, dass ich den Wertebereich unter-bzw. überschritten habe?

Diese Fehlermeldung zeigt mir dies nicht an, zeigt aber auf die Codezeile.

Also müssten mir hier noch Parameter fehlen.

MVg

need-some-blood

Link zu diesem Kommentar
Auf anderen Seiten teilen

Fehlermeldung

[Fehler] mainframeunit.pas(148): Nicht genügend wirkliche Parameter

Bei dieser Fehlermeldung kann es glaube ich manchmal vorkommen, dass der Cursor in der falschen Zeile steht. Vielleicht hast du vor dieser Zeile noch ein anderes Problem?

Wenn ich versuche, folgendes zu kompilieren:

  if (Image1.Canvas.Pixels[2,2] in [$0000FF00..$000000FF]) then

  begin

    Label1.Caption := 'treffer';

  end;

dann erhalte ich (in Delphi 7) wie erwartet diese Fehlermeldung:

[Fehler] TestCanvas.pas(78): Konstantenausdruck verletzt untere Grenzen

(Der Cursor steht dabei jeweils hinter den HexWerten.) Dein Fehler befindet sich also offenbar schon vor dieser Stelle, ggf. schon vor der if-Anweisung.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...