2

私は中心をスケーリングして描画したいバッファを持つgraphics.drawImageと、バッファを描画したい座標とスケールを持つRectangleを持っています。

tr2.translate(buffer.getWidth()/2, buffer.getHeight()/2);
tr2.scale((double)rect.width/buffer.getWidth(),(double) rect.height/buffer.getHeight());
tr2.translate(-buffer.getWidth()/2, -buffer.getHeight()/2);

問題は、それを長方形の座標に合わせるために何をする必要があるかということです?

バッファー座標は、rect loaction にマップする必要があります。

したがって、rect の左上隅が (30,80) の場合、スケール後のバッファの左上隅も (30,80) にする必要があります。

問題は、スケールの前に左上隅が (0,0) だった場合、見つける必要があるスケールに応じて (-15,10) のようになります。

4

2 に答える 2

0

解決策は、2 つの変換を使用することです。

AffineTransform tr= new AffineTransform();
AffineTransform tr2= new AffineTransform();

1 つは、翻訳と整列を処理します。

tr.translate(rect.x+(rect.width-buffer.getWidth())/2,
rect.y+(rect.height-buffer.getHeight())/2); 

もう 1 つは中央のスケーリングを処理します。

tr2.translate(buffer.getWidth()/2, buffer.getHeight()/2);
tr2.scale((double)rect.width/buffer.getWidth(),
(double)rect.height/buffer.getHeight() );
tr2.translate(-buffer.getWidth()/2,-buffer.getHeight()/2);

次に、このように連結します。

tr.concatenate(tr2);

描画には tr を使用します。

gfx.drawImage(buffer, tr, null);

Concatenate はAffineTransform、互いに影響を与えないように分離しておくようです。

で計算を修正すれば、おそらくスケーリング アンカーを任意にすることができます。tr.translate

于 2013-05-31T07:19:45.930 に答える