0

Graphics32 は、イメージ ラッピング サンプル (\Transformation\ImgWarping_Ex) を提供しており、ユーザーはブラシを使用して bitmap32 の一部をラップできます。ただし、このサンプルは多くの複雑な概念が混在しているため、理解するのが非常に困難です。

ポリゴン領域をある形状から別の形状に変換するラッピング変換が必要だとしましょう。どうすればそのようなタスクを達成できますか?

4

1 に答える 1

1

コメントのように、多面ポリゴンについてはわかりません。ただし、ある四角形を別の四角形に変換するには、射影変換を使用できます。これは、4 点で構成される四角形を 4 点で構成される別の四角形にマッピングします。(私がこのSOの質問をしたときに、私はもともとこれについて知りました。)

君は:

  • Transform メソッドを使用する
  • ターゲットとソースのビットマップを渡す
  • 宛先ポイントで初期化された射影変換オブジェクトを渡します
  • 1 つ以上の入力ピクセルから出力ピクセルを作成する方法を制御するラスタライザを渡します。

ラスタライザは少なくともオプションですが、デフォルト以外の高品質 (低速) ラスタライザ チェーンを指定すると、より高品質の出力が得られます。他にもオプションのパラメータがあります。

それらの鍵はTProjectiveTransformationオブジェクトです。残念ながら、Graphics32 のドキュメントには のエントリがないように思われるため、Transform methodリンクできません。ただし、これは私のコードに基づいた、テストされていないサンプルコードです。長方形のソース画像をターゲット画像上の凸状の四角形に変換します。

var
  poProjTransformation : TProjectiveTransformation;
  poRasterizer : TRegularRasterizer; 
  oTargetRect: TRect;
begin
  // Snip some stuff, e.g. that 
  // poSourceBMP and poTargetBMP are TBitmap32-s.
  poProjTransformation := TProjectiveTransformation.Create();
  poRasterizer := TRegularRasterizer.Create();

  // Set up the projective transformation with:
  // the source rectangle
  poProjTransformation.SrcRect = FloatRect(TRect(...));
  // and the destination quad
  // Point 0 is the top-left point of the destination
  poProjTransformation.X0 = oTopLeftPoint.X();
  poProjTransformation.Y0 = oTopLeftPoint.Y();
  // Continue this for the other three points that make up the quad
  // 1 is top-right
  // 2 is bottom-right
  // 3 is bottom-left
  // Or rather, the points that correspond to the (e.g.) top-left input point; in the
  // output the point might not have the same relative position!
  // Note that for a TProjectiveTransformation at least, the output quad must be convex

  // And transform!
  oTargetRect := TTRect(0, 0, poTarget.Width, poTarget.Height)
  Transform(poTargetBMP, poSourceBMP, poProjTransformation, poRasterizer, oTargetRect);

  // Don't forget to free the transformation and rasterizer (keep them around though if
  // you're going to be doing this lots of times, e.g. on many images at once)
  poProjTransformation.Free;
  poRasterizer.Free;

ラスタライザーは画質にとって重要なパラメーターです。上記のコードは、機能しますが、最近傍サンプリングを使用するため、きれいではありません。TSuperSamplerをとともに使用するなど、オブジェクトのチェーンを構築して、より良い結果を得ることができますTRegularRasterizer。サンプラーとラスタライザー、およびそれらを組み合わせる方法については、こちらを参照してください。

メソッドには約 5 つの異なるオーバーロードもありTransform、ファイルのインターフェイスでそれらをざっと読んで、GR32_Transforms.pas使用できるバージョンを確認することをお勧めします。

于 2012-08-07T13:51:57.427 に答える