Graphics32 は、イメージ ラッピング サンプル (\Transformation\ImgWarping_Ex) を提供しており、ユーザーはブラシを使用して bitmap32 の一部をラップできます。ただし、このサンプルは多くの複雑な概念が混在しているため、理解するのが非常に困難です。
ポリゴン領域をある形状から別の形状に変換するラッピング変換が必要だとしましょう。どうすればそのようなタスクを達成できますか?
Graphics32 は、イメージ ラッピング サンプル (\Transformation\ImgWarping_Ex) を提供しており、ユーザーはブラシを使用して bitmap32 の一部をラップできます。ただし、このサンプルは多くの複雑な概念が混在しているため、理解するのが非常に困難です。
ポリゴン領域をある形状から別の形状に変換するラッピング変換が必要だとしましょう。どうすればそのようなタスクを達成できますか?
コメントのように、多面ポリゴンについてはわかりません。ただし、ある四角形を別の四角形に変換するには、射影変換を使用できます。これは、4 点で構成される四角形を 4 点で構成される別の四角形にマッピングします。(私がこのSOの質問をしたときに、私はもともとこれについて知りました。)
君は:
ラスタライザは少なくともオプションですが、デフォルト以外の高品質 (低速) ラスタライザ チェーンを指定すると、より高品質の出力が得られます。他にもオプションのパラメータがあります。
それらの鍵は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
使用できるバージョンを確認することをお勧めします。