3

私が目指している解決策は、与えられた数のサイズから最適な画像サイズを選択することです。

かなりランダムな解像度がいくつかあるので、自分の好みのサイズにできるだけ近いサイズの画像を見つけたいと思います。

幅x高さ()のサイズの画像を使用したいとしますpreferredImageSize

例:320x200

次の画像サイズを自由に使用できるとします(availableImageSize)width1 x height1、width2 x height2、...(最大10の異なるサイズ)。

例:474x272、474x310、264x150、226x128、640x365、474x410、480x276、256x144、160x90、320x182、640x365、192x108、240x137、480x276

変数を作成するための一般的なアプローチを開発するために、私はかなり高速に計算するだけでなく、画面上で見栄えのpreferredImageSizeするものになる優れたソリューションを見つけようとしています。

私は次のような画像として画面上で見栄えを良くすると定義します。

  1. ほとんどアップスケールされていません
  2. preferredImageSize.width / preferredImageSize.height与えられたアスペクト比( )にできるだけ近い
  3. 大幅にダウンスケールされる可能性があります
  4. 非常に少量でトリミング/ストレッチされる場合があります

私の最初の(かなり些細な)アプローチ:

使用可能な画像サイズを1回実行し、最小幅のデルタ(abs(preferredImageSize.width - availableImageSize.width))を見つけます。次に、その最小のデルタを持つ画像が選択されます(bestFitWidth)。

それは確かに問題を解決する方法ですが、画面の希望に私の見栄えに間違いなく準拠していません。

テキスト、ソース、リンクが素晴らしいかどうかに関係なく、ヒントはありません。わあ、私の要件(別名希望)がすでに間違った方向に進んでいると思われる場合は、先に進んで、私に知らせてください...


編集:オプションとしてトリミングとストレッチを追加しました-これにより、問題の解決がさらに難しくなると思います。したがって、必要に応じて、方程式から除外してください。

4

1 に答える 1

3

単純な「if/then」アプローチ:

私は2つのことをします:

  1. アップスケールはしたくないが、ダウンスケーリングは問題ないので(これは良い選択だと思います)、使用可能なものがない場合を除いて、ターゲットよりも小さいソースイメージを使用しないでください。
  2. 「重い」ダウンスケーリングは問題ないので、許容できる最小の画像から始めて、徐々に大きくなる画像に向かって、アスペクト比にできるだけ一致する画像を見つけようとします。

まとめるには、まず、ターゲットよりも小さいリストからすべての画像を破棄します。次に、残っている最小の画像から始めて、ターゲットに対するアスペクト比を確認します。不一致が許容できる場合(定量化する必要があります)、画像を使用します。そうでない場合は、次に大きい画像に移動します。許容できるものが見つからない場合は、最も一致するものを使用してください。

すでにすべての画像をターゲットよりも小さく破棄している場合は、どちらの方法でも見栄えの悪い画像になる可能性がありますが、よりアップスケーリングが必要な画像を使用する方が悪いかどうかを試してみてください。アスペクト比の一致が悪い画像を使用するのはさらに悪いことです。

もう1つ考慮する必要があるのは、ターゲットのアスペクト比に一致するように画像を拡大またはトリミングするかどうかです。

より複雑な定量的アプローチ:

ただし、最も柔軟なアプローチは、サイズの不一致とアスペクト比の不一致に依存する「ペナルティ」関数を自分で定義してから、「ペナルティ」が最も低いソース画像を見つけることです。これはあなたが現在行ったことであり、ペナルティ関数をとして定義しましたabs(preferredImageSize.width - availableImageSize.width)。たとえば、次のように、もう少し複雑なものを使用できます。

width_diff  = preferredImageSize.width  - availableImageSize.width
height_diff = preferredImageSize.height - availableImageSize.height
if (width_diff > 0) width_penalty = upscale_penalty   * width_diff
               else width_penalty = downscale_penalty * width_diff
if (height_diff > 0) height_penalty = upscale_penalty   * height_diff
                else height_penalty = downscale_penalty * height_diff
aspect_penalty = ((preferredImageSize.width / preferredImageSize.height) - 
                  (availableImageSize.width / availableImageSize.height)) * stretch_penalty;
total_penalty = width_penalty + height_penalty + aspect_penalty;

これで、3つの数値、、を試してupscale_penaltydownscale_penaltyこれらstretch_penalty3つの品質低下操作に異なる重要性を与えることができます。いくつかの組み合わせを試して、どれが最適かを確認してください。

于 2013-03-05T23:13:46.263 に答える