2011-02-01 1 views
0

ちょっとみんな、画像を一定のサイズにリサイズするPHPスクリプトがありますしかし、それが違うなら、最初に作物を作ってしまうのです。私はちょうど私のロジックが正しいチェックしたい、これはすべての送信元と送信先の画像サイズに関連する寸法を計算することを:私は、これはすべての事態をキャッチしてのx、y座標を開始生成する必要が出て働くことができるものから、画像のリサイズ/クロッピングのロジックは正しいですか(PHPではありませんが、コードではなくロジックに関するものです)

$sourceratio = $actualsourcewidth/$actualsourceheight; 
$targetratio = $targetwidth/$targetheight; 

if ($targetratio < $sourceratio) 
{ 
    $srcheight = $actualsourceheight; 
    $srcwidth = $actualsourceheight * $targetratio; 
    $srcy = 0; 
    $srcx = floor(($actualsourcewidth - $srcwidth)/2); 
    $srcwidth = floor($srcwidth); 
} else if ($targetratio > $sourceratio) 
{ 
    $srcwidth = $actualsourcewidth; 
    $srcheight = $actualsourcewidth/$targetratio; 
    $srcy = floor(($actualsourceheight - $srcheight)/2); 
    $srcx = 0; 
    $srcheight = floor($srcheight); 
} else 
{ 
// Same aspect ratio so you can resize the image without cropping 
    $srcheight = $actualsourceheight; 
    $srcwidth = $actualsourcewidth; 
    $srcx = 0; 
    $srcy = 0; 
} 

$srcxおよび$srcy)およびソース寸法($srcwidth,$srcheight)であり、これを次にimagecopyresampledに渡すことができる。

私がチェックしたかった主な点は、比率チェックでこれを壊すので、$srcheight$srcwidthが元の幅/高さより大きくなるのを防ぐことでしたが、私はそれはできないと思いますか?

ありがとうございます。

デーブ

答えて

0

これはうまくいくようです。私は変数を初期化し、それらを抽出し、それをいくつかリファクタリングします。これにより、最後のelseブロックが不要になり、コードを読みやすくなります。

$sourceratio = $actualsourcewidth/$actualsourceheight; 
$targetratio = $targetwidth/$targetheight; 
$srcx = 0; 
$srcy = 0; 
$srcheight = $actualsourceheight; 
$srcwidth = $actualsourcewidth; 

if ($targetratio < $sourceratio) 
{ 
    $srcwidth = $actualsourceheight * $targetratio; 
    $srcx = floor(($actualsourcewidth - $srcwidth)/2); 
    $srcwidth = floor($srcwidth); 
} else if ($targetratio > $sourceratio) 
{ 
    $srcheight = $actualsourcewidth/$targetratio; 
    $srcy = floor(($actualsourceheight - $srcheight)/2); 
    $srcheight = floor($srcheight); 
} 

あなたは$srcwidth$srcheightはオリジナルを超えないことが確実になりたい場合は、いつでもその値をクランプすることができます。

$srcheight = min($actualsourceheight, floor($srcheight)); 

可能性のある分散がわずかであるため、各シナリオをテストすることもできます。

+0

あなたの答えをありがとう、私は変数の初期化について同意します。私は多変量でそれをテストしましたが、それはいつも元気に戻ってきますが、実際には、幅と高さが関係なく、これらが決して上回らないと思っていることを数学的にチェックしたかったのですか? – deshg

関連する問題