2011-08-11 5 views
5

画像をターゲットの寸法に合わせるのに誰かが数学/擬似コード/ Javaコードを手伝ってもらえないかと思います。アスペクト比は維持するが、xとyスケールの両方で目標寸法を下回らないことが要求される。最終計算ディメンションは要求されたターゲットよりも大きくなる可能性がありますが、ターゲットに最も近いディメンションである必要があります。対象を下回ることなくアスペクト比を維持しながら画像を拡大/縮小

例: 私は200x100の画像を持っています。ターゲットディメンション30x10にスケールダウンする必要があります。 xとyの両方の縮尺が少なくとも目標で指定されている原点の縦横比を維持する最小寸法を見つける必要があります。この例では ですが、xスケールがターゲット(30)を下回ったため、20x10は良くありません。 最も近いものは30x15

ありがとうございます。

答えて

11
targetRatio = targetWidth/targetHeight; 
sourceRatio = sourceWidth/sourceHeight; 
if(sourceRatio >= targetRatio){ // source is wider than target in proportion 
    requiredWidth = targetWidth; 
    requiredHeight = requiredWidth/sourceRatio;  
}else{ // source is higher than target in proportion 
    requiredHeight = targetHeight; 
    requiredWidth = requiredHeight * sourceRatio;  
} 

この方法は、あなたの最終的な画像:

  • は、常にトリミングされていないのに対し、ターゲット内に収まります。

  • は元のアスペクト比を維持します。

  • 常にターゲットのサイズと一致する幅または高さ(またはその両方)を持ちます。

+0

ありがとうございました:)しかし、私が必要とするのは、幅と高さの両方が目標のカウンタ部分と常に一致するか、それよりも大きくなるということです。フィットは正確に一致する場合にのみ受け入れられ、そうでない場合はより大きくなるはずです。それが大きくなると、私はより大きいが、アスペクト比を維持する最小のものを見つける必要がありました。 –

+0

あなたは歓迎ですが、あなたが期待していたものであれば「回答として受け入れる」ことができます。 – darma

+0

私はenterをクリックして投稿したので、私のコメントを変更しました。場合によっては次元の1つがターゲットを下回る可能性があるため、ソリューションは部分的に完全です。 –

1

あなたの例では、すでにあなたが探しているアルゴリズムを使い切っています。 あなたが与えた例を使用します。

Original   Target 
200 x 100 -> 30 x 10 

1. You take the bigger value of the target dimensions (in our case 30) 
2. Check if its smaller than the corresponding original width or height 
    2.1 If its smaller define this as the new width (So 30 is the new width) 
    2.2 If its not smaller check the other part 
3. Now we have to calculate the height which is simply the (30/200)*100 

So as result you get like you wrote: 30 x 15 

希望は、これはあなたがのBufferedImageを使用し、単にそのような正しいスケール値を持つ新しいBufferedImageを作成することができ符号化部では

:)明らかになりました。

BufferedImage before = getBufferedImage(encoded); 
int w = before.getWidth(); 
int h = before.getHeight(); 
BufferedImage after = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
AffineTransform at = new AffineTransform(); 
at.scale(2.0, 2.0); // <-- Here you should use the calculated scale factors 
AffineTransformOp scaleOp = 
new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR); 
after = scaleOp.filter(before, after); 
+0

ありがとうございます。私は私のIDEのdarmaの返信とコメントをチェックしていました。これは非常に明確で正確です。どうもありがとうございました。 2つの答えを受け入れることは可能ですか? –

+0

いいえ、あなたは2つの答えを受け入れることはできませんが、両方をアップヴォートできます。 – Prine

関連する問題