0

ネストされたifステートメントの束でこれを実行できることはわかっていますが、もっとエレガントな方法があるように感じずにはいられません。それは本当に数学の問題だと思いますが、実際にあるのであれば、私はpythonicの答えに興味があります。

任意のサイズ/アスペクト比の画像があります。

最小55wx168hをカバーするように、スケールアップまたはスケールダウンする必要があります

ここでの複雑さは、画像が収まる正方形の一辺の長さを指定する単一の値のみをとる関数によってスケーリングする必要があることです。

たとえば、サイズが1000w x 500hの画像があり、それを200に拡大縮小すると、結果の画像は一辺が200の正方形の内側に収まる必要があります。つまり、結果の画像は200wx100hになります。

逆に、画像が200x1000で、200に拡大縮小すると、40x200になります。

したがって、1000x500の画像を55x168をカバーするように拡大縮小するには、画像を336に拡大縮小する必要があります。これは、336x336の側面の正方形内に収まる最大の画像であるため、336x168のサイズになります。

また、200x1000の画像を55x168をカバーするように拡大縮小するには、画像を275に拡大縮小し、最終的に55x275にする必要があります。

うまくいけば、これは泥よりも明確です!アイデアをありがとう。

正当化:正方形の辺の値を使用してスケーリングする理由に関心がある場合は、これがPicasaがURLインジェクションを介して画像をスケーリングする方法です。たとえば、次の2つのURLを使用します。

両方にURLコンポーネントがあることに注意してくださいs150。ただし、一方の画像は150x112で、もう一方の画像は112x150です。150は、これらの画像が両方とも収まる正方形の値です。

4

2 に答える 2

1

詳細についてもっと言う必要があるかもしれませんが、関数は画像またはその寸法のいずれかにアクセスできると仮定します。そうしないと、計算ができません。

しかし、それを手にすると、このようなものが機能するはずです:

def percent_to_scale_to(image, box_side_px):
    img_width, img_height = Image(image).size()  # or however you get w/h
    greater_img_dimension = max(img_width, img_height)
    scale_percent = (float(box_side_px) / float(greater_img_dimension)) * 100.0

いくつかの呼び出しの署名を調べる必要があり、カットアンドペーストで機能することを期待しないでください。ただし、疑似コードとしては、アプローチのアイデアが得られる可能性があります。:)

予期しない動作を引き起こす可能性のある整数除算に注意する必要があります。そのため、分割前にフロートに変換されます。それ以外の場合、結果は小数点で切り捨てられ、ほとんどの場合、ゼロの戻り値が生成される可能性があります。まだ慣れていない場合は、Pythonの分割動作に関する簡単な調査を行う価値があります。

于 2013-01-23T09:03:25.753 に答える
1
def name_of_function(img_x, img_y):  # for lack of a better name
    image_dimensions = (img_x, img_y)
    min_dimensions = (55.0, 168.0)
    scale = min(image_dimensions[i]/min_dimensions[i] for i in range(2))
    return max(i/scale for i in image_dimensions)

name_of_function(1000, 500)
# 336.0
name_of_function(200, 1000)
# 275.0

これがあなたが探しているものであることをかなり確信してください。

于 2013-01-23T09:06:53.100 に答える