delphi delphi-xe2 firemonkey

delphi - Mapa de bits y colores de Firemonkey(FMX)



delphi-xe2 (2)

Supongamos que tengo un pequeño mapa de bits en Firemonkey (digamos 32x24 píxeles). Así que puse un TImage en un formulario y en el constructor hay este código:

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;

Esto dibuja una bonita línea diagonal en blackground.

Lo que quiero hacer ahora es analizar el mapa de bits para determinar los píxeles afectados por el dibujo de la línea. Si realizo una comprobación básica de píxel por píxel usando:

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]]));

la salida en mi Memo es:

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

entonces ¿está interpretando y "difuminando"? mi línea como los colores (representados por c arriba) no son iguales a claYellow ($ FFFF00). Si dibujo una línea horizontal o vertical, el efecto es el mismo. Si cambio mi grosor de trazo a 2 y dibujo una línea no diagonal, dibuja claYellow pero cubre 2 píxeles.

Entonces, ¿cómo puedo determinar los píxeles "verdaderos" que he dibujado? En la muestra anterior, yo podría (podría) buscar $ FFE7E700, pero ¿cómo sé si debo buscar ese valor (dado que si dibujara la línea en un color diferente, ese valor sería diferente)? Traté de ver si había una "diferencia" consistente entre el color con el que dibujé y el color real prestado, pero no pude encontrar uno.

Gracias


FMX usa antialiazing para dibujar. Si desea dibujar una línea sin efecto borroso, debe usar una función especial para la alineación de píxeles:

  • TCanvas.AlignToPixel
  • TCanvas.AlignToPixelVertically
  • TCanvas.AlignToPixelHorizontally

Esta función calcula automáticamente la posición de píxeles para dibujar sin desenfoque.

Gracias


Los colores del ejemplo son antialias, lo que significa que son parte del color que configura y parte del color de fondo. La relación precisa se basa en muchas consideraciones hechas detrás de escena.

No estoy familiarizado con FireMonkey (o Delphi), así que no puedo decirte si hay una forma de evitarlo, pero si quieres saber dónde aterriza un determinado color, lo que podrías hacer es probar las relaciones entre los valores RGB, eso suponiendo que dibujes solo una línea sobre fondo negro (de lo contrario, las relaciones deben ser un rango para capturar píxeles con grandes cantidades de ruido)

ejemplo: amarillo (# ffff00)

rojo / verde = 1

rojo / azul = verde / azul = # inf (o si lo desea, 255/1 = 255)

un píxel muestreado podría ser # fcfc00 manteniendo las proporciones

un píxel muestreado con ruido podría ser # fcff09 tiene

rojo / verde = 0.988

rojo / azul = 28

verde / azul = 28.33

el rojo y el verde son todavía muy cercanos y ambos mucho más altos que el azul.