4

画像の元の縦横比を維持しようとしながら、ユーザーが画像のサイズを変更できるようにしています。

サイズ変更操作ごとに、幅と高さの変更を示す「オフセット」変数があります。これはマウスの動きに基づいているため、サイズ変更中にマウスをどれだけ動かしたかに応じて、値の任意の組み合わせになる可能性があります。

私が今行っているのは、2 つの値 (x と y の変化) のうち大きい方を取り、それを使用して同じアスペクト比で他の値を計算することです。これが私のコードです:

if (Math.Abs(offset.X) > Math.Abs(offset.Y))
{
    offset.Y = (int)(offset.X / AspectRatio);
}
else
{
    offset.X = (int)(offset.Y * AspectRatio);
}

アスペクト比は、標準の幅/高さの値です。

私のコードの問題は、整数値を使用しているため、丸められて縦横比が歪むことです。

私がする必要があるのは、縦横比で割り切れる整数値にスナップすること、またはその目的のために何かを行うことだと思います。しかし、これらの x と y の「オフセット」値を変更してそれを行う方法がわかりません。

4

2 に答える 2

2

offset.X、.Y および AspectRatio を float/double にし、必要な計算を行い、新しいサイズが計算されてから整数に丸めます。
これにより、可能な限り最高の精度が得られます。

PS 単純に int にキャストする代わりに Math.Round を使用すると、精度が向上します。

于 2011-11-07T15:39:34.103 に答える
1

私がする必要があるのは、縦横比で割り切れる整数値にスナップすること、またはその目的のために何かを行うことだと思います。しかし、これらの x と y の「オフセット」値を変更してそれを行う方法がわかりません。

アスペクト比の不完全な丸め、トリミング、または分厚いサイズ変更のいずれかになります。これについて考えてください:

アスペクト比が 3:4 の場合、元の比率と完全に一致するように水平方向にスケーリングできる最小サイズはどれくらいですか?

4 ピクセル。

アスペクト比を 2 つの大きな素数に変更すると、問題が発生します。

これの代わりに、画像を 1 次元でトリミングするか、画像フィルタリングを使用して補間を行い、完全ではないアスペクト比の変更を受け入れることができます。

計算が正しいことを確認してください。縦横比を浮動小数点値として計算し、最後の計算でのみ整数に切り捨てます。そうしないと、二重の丸め誤差が発生します。

于 2011-11-07T15:37:19.033 に答える