need-some-blood Geschrieben 26. Oktober 2005 Geschrieben 26. Oktober 2005 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 Zitieren
geloescht_JesterDay Geschrieben 26. Oktober 2005 Geschrieben 26. Oktober 2005 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... Zitieren
TinCan Geschrieben 27. Oktober 2005 Geschrieben 27. Oktober 2005 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 Zitieren
need-some-blood Geschrieben 30. Oktober 2005 Autor Geschrieben 30. Oktober 2005 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 Zitieren
TinCan Geschrieben 31. Oktober 2005 Geschrieben 31. Oktober 2005 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. Zitieren
Empfohlene Beiträge
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.