2012-02-16 7 views
1

私は、この問題の最も洗練された「正しい」解決法を見つけることに興味があります。私はJS/PHPを初めて使いました。本当にうれしく思います。目標は、与えられたイメージのサイズをイメージの「フレーム」のサイズと比較して(最終的に<div>または<li>になるように)、それに応じてイメージのサイズを変更することです。ユーザーは多くのサイズと形状の画像をアップロードし、多くのサイズと形状のフレームが作成されます。目標は、指定された画像が、指定されたフレームに合わせて正しくサイズ変更されるようにすることです。最終的な実装はPHPで行われますが、私はJSのロジックを試しています。私は、異なる値の束でそれをテストしてみた 最もエレガントなイメージからイメージへのフレーム比較アルゴリズム

//predefined variables generated dynamically from other parts of script, these are example values showing the 'landscape in landscape' ratio issue 
var $imageHeight = 150, $imageWidth = 310, $height = 240, $width = 300;   
//check image orientation 
if ($imageHeight == $imageWidth) { 
    var $imageType = 1; // square image 
} else if ($imageHeight > $imageWidth) { 
    var $imageType = 2; // portrait image 
} else { 
    var $imageType = 3; // landscape image 
}; 
//check frame orientation and compare to image orientation 
if ($height == $width) { //square frame 
    if (($imageType === 1) || ($imageType === 3)) { 
     $deferToHeight = true; 
    } else { 
     $deferToHeight = false; 
    }; 
} else if ($height > $width) { //portrait frame 
    if (($imageType === 1) || ($imageType === 3)) { 
     $deferToHeight = true; 
    } else { 
     if (($imageHeight/$height) < 1) { 
       $deferToHeight = true; 
      } else { 
       $deferToHeight = false; 
     }; 
    }; 
} else { //landscape frame 
    if (($imageType === 1) || ($imageType === 2)) { 
     $deferToHeight = false; 
    } else { 
     if (($imageWidth/$width) > 1) { 
       $deferToHeight = true; 
      } else { 
       $deferToHeight = false; 
     }; 
    }; 
}; 
//set values to match (null value scales proportionately) 
if ($deferToHeight == true) { //defer image size to height of frame 
    $imageWidth = null; 
    $imageHeight = $height; 
} else { //defer image size to width of frame 
    $imageWidth = $width; 
    $imageHeight = null; 
}; 

、それはを動作しますが、私ははるかにエレガントなソリューションを実装していることができると疑いを持っている:ここでは私が持っているものです。私は何をうまくできましたか?

+0

[コードレビュー](http://codereview.stackexchange.com/)に所属しています。 – millimoose

+0

ああ、私はこれが存在するのか分からなかった。ありがとう、私はこれのようなものを将来そこに掲示します。 – nulluser

答えて

0

は、ここで私はJSの実装では、最近、この正確な問題に対処方法は次のとおりです。

// determine aspect ratios 
var a1 = imageWidth/imageHeight, 
    a2 = frameWidth/frameHeight, 
    widthDetermined = a1 > a2; 

// set scale 
var scale = widthDetermined ? 
    // scale determined by width 
    frameWidth/imageWidth : 
    // scale determined by height 
    frameHeight/imageHeight; 

// set size (both dimensions) based on scale 
imageWidth = scale * imageWidth; 
imageHeight = scale * imageHeight; 

はるかに少ないコードバージョンよりも。正方形の大文字と小文字はどちらの方法でも処理されることに注意してください。

+0

うわー。これは本当に素晴らしいです。あなたは 'box'と' startbox'パラメータについて説明できますか?私はその部分以外はすべて把握していると思う。あなたの知識を共有してくれてありがとう。 – nulluser

+0

おっと、申し訳ありませんが、カットアンドペーストが失敗しました。これは単に画像とフレームを参照していました。上記の私の編集を参照してください。 – nrabinowitz

+0

問題ありません!私はそれを実行し、それは本当にうまく動作します。画像の幅と枠の幅の比が、画像の高さとフレームの高さの比よりも大きい場合をどのように考慮しますか?例えば、与えられた値では、フレームを水平に塗りつぶすが、垂直には塗りつぶさない画像になります。そのような場合、私たちは身長に遅れをとらなければなりません。私があなたのバージョンを正しく読んでいるならば、私たちはその幅まで延期するでしょう。 – nulluser

0

画像が正方形の画像を想定していて、それを縦長に変換したい場合は、画像が縦長のように見えませんか?私は割合が変更され、画像が悪く見えるかもしれないと感じます。あなたはどう思いますか?

+0

申し訳ありませんが、そのような場合には、画像がクリップされることに言及すべきです。画像は不均衡に伸ばされることはありません。 – nulluser

関連する問題