2017-07-07 3 views
2

ポストスクリプトの画像に歪みを適用しようとしています。両方-0.5は、垂直および水平軸上の22.5度の傾きを指すポストスクリプトの中心にあるせん断/スキュー

[1 -0.5 -0.5 1 0 0] concat 

:私は正常でそれを行っています。問題は、スキューが中央にないことです。イメージの中心が移動して、イメージがスキューを適用した後に同じ位置にとどまらないようにすることです。

位置を維持しながら傾きを適用するにはどうすればよいですか?斜め前後の画像を翻訳しようとしましたが、画像をどのくらい平行移動しても同じ位置にとどまるようにどれくらいの大きさを見つけることができません。

答えて

1

私は最終的にそれを行う方法を見つける。まず、翻訳して通常どおり要素を配置:

1135 568 translate 

をその後、同時に一つの軸XまたはY、両方ではないだけスキュー。今、画像のバウンディングボックスの幅が大きいので、我々はできる。この後

[1 0 0.3639 1 0 0] concat 

、画像を翻訳:マトリックス内の数字は、例えば、X軸上の20度の角度のためにそうtan(skew_angle)ですこの追加の幅をadditional_width = abs(object_height * tan(skew_angle))として計算します。だから今、私たちはこの半分の幅を翻訳:

{additional_width/2} 0 translate 

は、今、私たちは同じようにYのスキューを行います

[1 0.3639 0 1 0 0] concat 

そして、これにadditional_height = abs(object_width * tan(skew_angle))

0 {additional_height/2} translate 

として追加の高さを計算します一方、スキューを適用した後、対象物の中心は同じ位置にとどまる。

1

現在の変換行列を変更することによって歪曲が働きますが、これはまったく中央にはありません。

イメージは、イメージを上から下に描画した環境からPostScriptに印刷するときの一般的な方法であるCTMをさらに変更しない限り、左下隅から記述されます。

基本的に、問題を解決するには、PLRMで説明されている行列操作と数式を理解する必要があります。

イメージを描画する直前の時点で連結を適用し、他のCTM操作が行われていないと仮定すると、イメージの左下隅は0,0になります。コンカットはそれに影響を与えません(あなたがTxとTyメンバーをマトリックスに持っていない限り)が、イメージが描画される場所を変更します。あなたがする必要があることは、通常描画されたときに画像の中心の座標を計算し、修正されたCTMの適用後にその座標がどこで終わるかを計算し、次にTxとTyを加えて中心座標が要求される位置になるような値である。または原点を適切に翻訳する。

重要なポイントは、画像にCTMの上に適用される独自のマトリックスがあることです。画像の中心のユーザ空間の座標を計算するには、画像マトリックスをCTMに適用する必要があります。そして、変換された画像の中心の位置を計算するために、剪断マトリクスを適用してもう一度やり直す必要があります。バニラ画像の中心と剪定された画像の中心の座標を取得すると、現在の点をどのように平行移動して中心座標が不変であるかがわかります。

あなたは例を提供していないので、私はあなたのためにそれを処理することはできません。私は単純な手で作業する必要はありません。私は時間があれば試してみるつもりです、もし私がすれば、私はここに投稿します。

関連する問題