指定したサイズ枠におさまるよう画像をcropしてresizseするときの計算
ありがちなんだが。
画像を画面に並べたいときって、1枚あたりの画像がこの枠にいい感じにおさまればいいな、ってのがある。
つまりサイズ枠を指定して、そこにおさまるように余分な部分をcropして、リサイズする。
たとえば、200x300の画像があったとして、それを100x100の枠で表示させたい。
すると、200x200になるようにcropかけて、それを100x100にリサイズするわけだ。
これをうまく計算するにはどうしたらよいかちょっと考えてみた。
計算部分だけ。
public static void crop(int aimW, int aimH, int orgW, int orgH) { double wRatio = (double )aimW/(double )orgW; double hRatio = (double )aimH/(double )orgH; int w = orgW; int h = orgH; double ratio = 1.0D; if(wRatio < hRatio) { w = (int)(((double )aimW)/hRatio); ratio = hRatio; } else { h = (int)(((double )aimH)/wRatio); ratio = wRatio; } System.out.print("aim:"+aimW+","+aimH); System.out.print(" crop:"+w + "," +h); System.out.println(" scale:"+w*ratio + "," +h*ratio); }
aimは指定サイズ、orgがオリジナルサイズ。
widthとheightそれぞれで指定とオリジナルの比をとってみると、上のやりかただと比が小さい方を切り取ればよい。
切り取ってどのぐらいにすればよいかは、比が大きい方で指定サイズをわると出る。
テストしてみよう。
public static void main(String[] args) { crop(100, 100, 200, 300); crop(100, 100, 50, 28); crop(100, 100, 50, 80); crop(230, 120, 950, 80); crop(800, 200, 100,200); crop(280, 300, 1000,400); }
aim:100,100 crop:200,200 scale:100.0,100.0 aim:100,100 crop:28,28 scale:100.0,100.0 aim:100,100 crop:50,50 scale:100.0,100.0 aim:230,120 crop:153,80 scale:229.5,120.0 aim:800,200 crop:100,25 scale:800.0,200.0 aim:280,300 crop:373,400 scale:279.75,300.0
うん、いけてそうな感じがする。
もっといい方法あるかな?