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

Предположим, у меня есть небольшое растровое изображение в 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, но как мне узнать, как искать это значение (учитывая, что если бы я нарисовал линию другим цветом, это значение было бы другим). Я пытался увидеть, есть ли "различие" между цветом, который я нарисовал, и фактическим отображенным цветом, но не смог найти его.

Спасибо

 TLama15 мая 2012 г., 09:46
Я не знаю FireMonkey, но это звучит как обычное сглаживание.
 Whiler15 мая 2012 г., 09:37
не ответ на твой вопрос ... но еще один интересныйвопро
 Uwe Raabe15 мая 2012 г., 09:50
Это не имеет ничего общего с FireMonkey. Он полностью зависит от базовой графической системы (GDI +, D2D, OpenGL).
 Jason17 мая 2012 г., 00:10
@ Giel - к сожалению, это не имело большого значения. он просто возвратил другое значение (в данном случае $ FFEBEB00).
 Giel15 мая 2012 г., 11:01
Если вы рисуете линию, используя «PointF (1.5,1.5), PointF (10.5,10.5)», антиалиасинг может отсутствовать, и он будет работать так, как вы ожидаете.

Ответы на вопрос(2)

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

TCanvas.AlignToPixel TCanvas.AlignToPixelVertically TCanvas.AlignToPixelHorizontally

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

Спасиб

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

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

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

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

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

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

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

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

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

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

Зеленый / синий = 28,33

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

Ваш ответ на вопрос