Entwickler-Ecke

Multimedia / Grafik - Rot Grün Blau und Helligkeitsanteil eines Pixels erkennen


Xadron - Fr 10.10.08 20:04
Titel: Rot Grün Blau und Helligkeitsanteil eines Pixels erkennen
Ich wollte von einem bestimmten Pixel der X und Y Coordinate die Helligkeit sowie den Blau, Grün und Rotanteil in eine bestimmte integer wie z.b. H, G, B, R, schreiben lassen. Dabei soll für das Maximum 255 bzw für das minimum 0 darin stehen.
Soetwas habe ich noch nie gemacht. Hat jemand einen guten Tipp, bzw ein Codefetzen, der das machen kann?

Danke für eure Hilfe


Yogu - Fr 10.10.08 20:18

Arbeitest du mit TCanvas? Dort gibt es zwei Möglichkeiten: Canvas.Pixels und Canvas.ScanLine. Die erste erkläre ich kurz, für die zweite schaust du bitte in der Delphi-Hilfe nach. Sie ist zwar etwas komplizierter, aber auch sehr viel performanter.

Canvas.Pixels:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
var PixelColor: TColor; R, G, B, H: Byte;
begin
  PixelColor := Canvas.Pixels[X, Y];

  // TColor: $00RRGGBB
  R := (PixelColor and $00FF0000div $10000;
  G := (PixelColor and $0000FF00div $100;
  B := (PixelColor and $000000FF);

  // Helligkeit: Durchschnitt der einzelnen Werte
  H := (R + G + B) div 3;
end;


Edit:: Ich bin beim Kopieren und Umschreiben mit der Delphi-Hilfe durcheinandergekommen, und da ist wohl etwas schief gelaufen. Wie user profile iconJakob_Ullmann ganz richtig bemerkt, sind die Rot- und Blauwerte in Delphi genau andersherum.

Moderiert von user profile iconNarses: Delphi-Tag repariert


Narses - Fr 10.10.08 20:19

Moin!

Schau mal hier [http://www.delphi-forum.de/viewtopic.php?t=44140], damit solltst du weiter kommen. ;)


@user profile iconYogu:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
  // TColor: $00RRGGBB
  R := (PixelColor and $00FF0000div $10000;
  G := (PixelColor and $0000FF00div $100;
  B := (PixelColor and $000000FF);
Ich würde die Werte erst mit SHR schieben und dann mit $FF maskieren, ist IMHO sicher besser (und performanter bei sehr vielen Operationen), als das mit einer Division zu machen. :idea:

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
// Helligkeit: Durchschnitt der einzelnen Werte
  H := (R + G + B) div 3;
end;
Die Helligkeit der Grundfarben ist nicht gleich gewichtet, schau mal in den gelinkten Thread. :les: ;)

cu
Narses


Jakob_Ullmann - Fr 10.10.08 20:36

In Delphi ist das nicht $00RRGGBB, sondern $00BBGGRR. :wink:


Xadron - Fr 10.10.08 22:36

Das ist eig. genau das was ich gesucht habe. danke