delphi - xe2 - FireMonkey(FMX) Bitmap und Farben




rad studio free (2)

Angenommen, ich habe eine kleine Bitmap in Firemonkey (sagen wir 32x24 Pixel). Also lege ich ein TImage auf ein Formular und im Konstruktor gibt es diesen Code:

  Image1.Bitmap.Create(32, 24);
  if Image1.Bitmap.Canvas.BeginScene then
  try
    Image1.Bitmap.Canvas.Fill.Color := claBlack;
    Image1.Bitmap.Canvas.Stroke.Color := claYellow;
    Image1.Bitmap.Canvas.FillRect(RectF(0,0,32,24), 0, 0, AllCorners, $FF);
    Image1.Bitmap.Canvas.DrawLine(PointF(1,1), PointF(10,10), $FF);
  finally
    Image1.Bitmap.Canvas.EndScene;
    Image1.Bitmap.BitmapChanged;
  end;

Dies zeichnet eine schöne diagonale Linie auf Blackground.

Was ich jetzt machen möchte, ist das Parsen der Bitmap, um die Pixel zu bestimmen, die von der Linienzeichnung betroffen sind. Wenn ich einen grundlegenden Pixel-zu-Pixel-Check mache mit:

  for y := 0 to 23 do
    for x := 0 to 31 do
      if Image1.Bitmap.Pixels[x,y] <> claBlack then
        memo1.Lines.Add(Format('x=%d. y=%d. c=%x', [x,y,Image1.Bitmap.Pixels[x,y]]));

Die Ausgabe auf mein Memo ist:

x=0. y=0. c=FF3C3C00
x=1. y=0. c=FF3C3C00
x=0. y=1. c=FF3C3C00
x=1. y=1. c=FFE7E700
x=2. y=1. c=FF3C3C00
x=1. y=2. c=FF3C3C00
x=2. y=2. c=FFE7E700
x=3. y=2. c=FF3C3C00
x=2. y=3. c=FF3C3C00
x=3. y=3. c=FFE7E700
x=4. y=3. c=FF3C3C00
x=3. y=4. c=FF3C3C00
x=4. y=4. c=FFE7E700
x=5. y=4. c=FF3C3C00
x=4. y=5. c=FF3C3C00
x=5. y=5. c=FFE7E700
x=6. y=5. c=FF3C3C00
x=5. y=6. c=FF3C3C00
x=6. y=6. c=FFE7E700
x=7. y=6. c=FF3C3C00
x=6. y=7. c=FF3C3C00
x=7. y=7. c=FFE7E700
x=8. y=7. c=FF3C3C00
x=7. y=8. c=FF3C3C00
x=8. y=8. c=FFE7E700
x=9. y=8. c=FF3C3C00
x=8. y=9. c=FF3C3C00
x=9. y=9. c=FFE7E700
x=10. y=9. c=FF3C3C00
x=9. y=10. c=FF3C3C00
x=10. y=10. c=FF3C3C00

also interpretieren und "verwischen"? Meine Linie als Farben (dargestellt durch c oben) ist nicht gleich ClaYellow ($ FFFF00). Wenn ich eine horizontale oder vertikale Linie zeichne, ist der Effekt gleich. Wenn ich meine Strichstärke auf 2 ändere und eine nicht diagonale Linie zeichne, wird Claymellow gezeichnet, aber es bedeckt 2 Pixel.

Wie kann ich die "echten" Pixel bestimmen, die ich gezeichnet habe? Im obigen Beispiel würde (könnte) ich nach $ FFE7E700 suchen, aber woher weiß ich, nach diesem Wert zu suchen (vorausgesetzt, dass, wenn ich die Linie in einer anderen Farbe zeichne, wäre dieser Wert anders). Ich habe versucht zu sehen, ob es einen konsistenten "Unterschied" zwischen der Farbe, mit der ich zeichnete, und der tatsächlichen Farbe, die gerendert wurde, aber nicht finden konnte.

Vielen Dank


Die Farben im Beispiel sind Anti-Aliasing, dh sie sind Teil der von Ihnen festgelegten Farbe und teilen sich die Hintergrundfarbe. Das genaue Verhältnis basiert auf vielen Überlegungen, die hinter den Kulissen gemacht wurden.

Nicht vertraut mit FireMonkey (oder Delphi), also kann ich Ihnen nicht sagen, ob es einen Weg darum herum gibt, aber wenn Sie wissen wollen, wo eine bestimmte Farbe landet, können Sie die Verhältnisse zwischen RGB-Werten testen, vorausgesetzt, Sie zeichnen nur eine Zeile auf schwarzem Hintergrund (ansonsten müssen die Verhältnisse ein Bereich sein, um Pixel mit großen Mengen an Rauschen einzufangen)

Beispiel: gelb (# ffff00)

rot / grün = 1

rot / blau = grün / blau = # inf (oder wenn Sie möchten, 255/1 = 255)

Ein abgetastetes Pixel könnte # fcfc00 sein, das die Verhältnisse beibehält

Ein abgetastetes Pixel mit Rauschen könnte # fcff09 haben

rot / grün = 0,988

rot / blau = 28

grün / blau = 28,33

rot und grün sind immer noch ziemlich nah und beide viel höher als blau.


FMX verwendet Antialiasing zum Zeichnen. Wenn Sie eine Linie ohne Unschärfeeffekt zeichnen möchten, sollten Sie eine spezielle Funktion für die Pixelausrichtung verwenden:

  • TCanvas.AlignToPixel
  • TCanvas.AlignToPixelVertically
  • TCanvas.AlignToPixelHorizontal

Diese Funktion berechnet automatisch die Pixelposition für das Zeichnen ohne Unschärfe.

Vielen Dank





firemonkey