Вопрос по – Firemonkey (FMX) растровое изображение и цвета

35

Предположим, у меня есть небольшое растровое изображение в Firemonkey (скажем, 32x24 пикселей). Поэтому я поместил TImage на форму и в конструкторе есть этот код:

  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;

Это рисует хорошую диагональную линию на черном фоне.

Теперь я хочу проанализировать растровое изображение, чтобы определить пиксели, на которые влияет рисование линий. Если я делаю базовую попиксельную проверку, используя:

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

вывод на мою записку:

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

так что это интерпретация и "размывание"? моя строка в цветах (обозначенных буквой c) не равна claYellow ($ FFFF00). Если я рисую горизонтальную или вертикальную линию, эффект тот же. Если я изменю свою толщину обводки на 2 и нарисую недиагональную линию, она будет рисоваться в claYellow, но она покрывает 2 пикселя.

Так, как я могу определить & quot; истинно & quot; пиксели, на которые я нарисовал. В приведенном выше примере я бы (мог) искать $ FFE7E700, но как мне узнать, как искать это значение (учитывая, что если бы я нарисовал линию другим цветом, это значение было бы другим). Я пытался увидеть, есть ли "различие" между цветом, который я нарисовал, и фактическим отображенным цветом, но не смог найти его.

Спасибо

Я не знаю FireMonkey, но это звучит как обычное сглаживание. TLama
Если вы рисуете линию, используя «PointF (1.5,1.5), PointF (10.5,10.5)» может не быть сглаживания, и он будет работать так, как вы ожидаете. Giel
@Giel - к сожалению, это не имело большого значения. он просто возвратил другое значение (в данном случае $ FFEBEB00). Jason
Это не имеет ничего общего с FireMonkey. Он полностью зависит от базовой графической системы (GDI +, D2D, OpenGL). Uwe Raabe
Error: User Rate Limit Exceededquestion Whiler

Ваш Ответ

2   ответа
1

что означает, что они разделяют заданный вами цвет и разделяют цвет фона. Точное соотношение основано на многих соображениях, сделанных за кадром.

Error: User Rate Limit Exceeded

пример: желтый (# FFFF00)

red/green=1

red/blue=green/blue=#inf(or if you want, 255/1=255)

Error: User Rate Limit Exceeded

выбранный пиксель с шумом может быть # fcff09

red/green=0.988

red/blue=28

green/blue=28.33

красный и зеленый все еще довольно близки, и оба намного выше, чем синий.

5

TCanvas.AlignToPixel TCanvas.AlignToPixelVertically TCanvas.AlignToPixelHorizontally

Эти функции автоматически рассчитывают положение пикселя для рисования без размытия.

Спасибо

Error: User Rate Limit Exceeded Jason

Похожие вопросы