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

36

Предположим, у меня есть небольшое растровое изображение в 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

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

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

Спасибо

  • 0
    не ответ на ваш вопрос ... но еще один интересный вопрос
  • 7
    Я не знаю FireMonkey, но это звучит как обычное сглаживание.
Показать ещё 6 комментариев
Теги:
delphi-xe2
firemonkey

2 ответа

5

FMX использует антиалиасинг для рисования. Если вы хотите рисовать линию без эффекта размытия, вы должны использовать специальную функцию для выравнивания пикселей:

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

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

Спасибо

  • 0
    Благодарю. Я только смог вернуться к этому. Можете ли вы уточнить свой ответ и проиллюстрировать, как эти функции будут использоваться в приведенном выше примере. В любом месте есть почти 0 документов об этих функциях, и то, что я пробовал, не меняет чтение - даже если я сейчас использую Map / Unmap растрового изображения.
1

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

Не знаком с FireMonkey (или delphi), поэтому я не могу сказать вам, есть ли способ обойти его, но если вы хотите знать, где находится определенный цвет, что вы можете сделать, это проверить соотношение между значениями RGB, предполагая, что вы нарисовываете только одну строку на черном фоне (иначе коэффициенты должны быть диапазоном для захвата пикселей с большим количеством шума)

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

красный/зеленый = 1

красный/синий = зеленый/синий = # inf (или если вы хотите, 255/1 = 255)

выбранный пиксель может быть # fcfc00, поддерживающим отношения

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

красный/зеленый = 0,988

красный/синий = 28

зеленый/синий = 28.33

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню