2

ピクセル間の境界を重ね合わせたビットマップ イメージをレンダリングできるようにしたいと考えています (境界の色は、自家製のルーチンによるものです)。ズームとパンでは、境界の目盛りは同じままでなければなりません。

画像の例を次に示します。拡大しても境界の厚さが変わらないことを示す画像

ズームとパンについては、こちらで説明されているようにgraphics32を使用しています 境界を描くために、AggPasModを使用してDelphi 2010、XE、XE2のベクター画像を作成することを考えました...これはChristian Buddeによって更新されましたこちら.

ただし、 AggPasModは独自のタイプの画像で動作するため両方のツールを相互作用させるのに苦労しています

私はコーディングの専門家ではないので、その問題を解決する最善の方法についてアドバイスをいただければ幸いです。

前もって感謝します、

4

2 に答える 2

3

ベクター エンジンを導入した GR32 の最新 (ベータ) バージョン 2.0 を使用することをお勧めします。これにより、既存のコードを引き続き使用して、既存のピクセル イメージの上に描画されたベクター グラフィックを追加できます。

これを行うには、まず最新の GR32 バージョンに切り替えます。コードはオープン SVN リポジトリから取得できます。トランクは次の場所にあります。

https://sourceforge.net/p/graphics32/code/HEAD/tree/trunk/

SVN を使用する場合 (推奨)、以下を使用してコードをチェックアウトできます。

svn checkout svn://svn.code.sf.net/p/graphics32/code/trunk graphics32-code

または、エクスプローラーの統合に TortoiseSVN を使用します。

コードを取得したら、探索を開始できます。ベクトル エンジンの使用方法を示す多くの例があります。Examples\Drawing の下の例を見てください。

特に、マウスでポリゴンを作成 (および操作) できる「ポリゴン」の例を見てください (単純な三角形を作成するには 3 回のクリックが必要です)。

独自のベクター グラフィックを作成するには、次のようなコードを使用できます。

uses
  ..., GR32_Polygons, GR32_Paths, GR32_Brushes;

var
  Canvas: TCanvas32;
  Stroke: TStrokeBrush;
begin
  // use a higher level abstraction class to generate the polygons
  Canvas := TCanvas32.Create(Image.Bitmap);

  // add a stroke brush and specify the color and width
  Canvas.Brushes.Add(TStrokeBrush);
  Stroke := TStrokeBrush(Canvas.Brushes[0]);
  Stroke.FillColor := SetAlpha(clBlack32, 200);
  Stroke.StrokeWidth := 2;

  // begin a path
  Canvas.Path.BeginPath;

  // specify 3 vertices
  Canvas.Path.MoveTo(10, 10);
  Canvas.Path.LineTo(20, 90);
  Canvas.Path.LineTo(60, 40);

  // close path
  Canvas.Path.ClosePath;
  Canvas.Path.EndPath;
end;

さらに、低レベル API を使用できます。これには、ユニット「GR32_Polygons」のみが必要です。同じコードは次のようになります。

uses
  ..., GR32_Polygons;

var
  Points: array of TFloatPoint;
begin
  SetLength(Points, 3);

  // specify 3 vertices
  Points[0] := FloatPoint(10, 10);
  Points[1] := FloatPoint(20, 90);
  Points[2] := FloatPoint(60, 40);

  // draw poylgon with certain color and width
  PolylineFS(Image.Bitmap, Points, SetAlpha(clBlack32, 200), True, 2.0);
end;

これは最初は単純に見えますが、ベクター エンジンでの描画が複雑になるほど、少し難しくなります。

GR32_VectorUtils ユニットの補助関数を使用すると、各頂点を個別に入力する手間を省くことができます。それが含まれています

Rectangle(const R: TFloatRect): TArrayOfFloatPoint;

これは、アプリケーションに最も役立つはずです。

必要に応じて、ポリゴンが描画される前に適用される変換を追加することもできます。


同じ例は、AggPas コードを使用して完全に記述することもできます。高速でもエレガントでもありませんが、ただ違うだけです。

于 2016-04-12T09:58:36.630 に答える
2

ベクター画像を自分で生成する方法を見ると、次のことができます。

  1. メインの背景画像を TBitmap または TBitmap32 にレンダリングし、ここで使用したズームとパンを保存します。
  2. ベクター イメージを作成する代わりに、ベクターを行の配列に保存します。
  3. 線の配列をたどり、クリッピング四角形と交差するすべての線に対して TBitmap.Canvas.Draw を実行します。これらの線を描画するときは、クリッピング オフセットとズームを補正することを忘れないでください。

    (x2 にズームインすると、線は 2 倍の長さになり、上と左から 2 倍離れて開始されます。左から 50 パンすると、line.start.x-50 に線が描画されます。など...)

出力画像の上に描画しています。これにより、背景画像のズーム量とは無関係に線幅を変更できます。

クリッピング領域のみに描画する代わりに、もちろん、ビットマップ全体を線で描画し、別のズームレベルまたは線幅が必要なときに再描画することができます。しかし、どのように 3MP 画像を使用できるかを見ると、セクションを表示するときにセクションのみをレンダリングする方が速いかもしれません。

さらに情報が必要な場合はお知らせください。幸運を祈ります:)

于 2016-04-11T14:47:27.890 に答える