Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Delphi] Pixelfarbe überprüfen

Empfohlene Antworten

Veröffentlicht

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

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...

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

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.