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ピクセルをカバーします。

では、描画した「真の」ピクセルをどのように判断できますか。上記のサンプルでは、​​$ FFE7E700を探す(できます)が、その値を探す方法を知るにはどうすればよいですか(別の色で線を引いた場合、その値は異なることになります)。描いた色と実際にレンダリングされた色の間に一貫した「違い」があるかどうかを確認しようとしましたが、見つけることができませんでした。

ありがとう

4

2 に答える 2

1

この例の色はアンチエイリアス処理されています。つまり、設定した色の一部であり、背景色の一部でもあります。正確な比率は、舞台裏で行われる多くの考慮事項に基づいています。

FireMonkey (または Delphi) に精通していないので、回避方法があるかどうかはわかりませんが、特定の色がどこに着地するかを知りたい場合は、RGB 値間の比率をテストすることができます。黒の背景に 1 行のみ (そうでない場合、比率はノイズの多いピクセルを捕捉する範囲でなければなりません)

例: 黄色(#ffff00)

赤/緑=1

赤/青=緑/青=#inf (または、必要に応じて 255/1=255)

サンプリングされたピクセルは、比率を維持する #fcfc00 である可能性があります

ノイズのあるサンプリングされたピクセルは #fcff09 の可能性があります

赤/緑=0.988

赤/青=28

緑/青=28.33

赤と緑はまだかなり近く、どちらも青よりもはるかに高くなっています。

于 2012-09-02T18:16:42.587 に答える