2017-05-29 17 views
1

イメージをアップロードできる管理サイトを持つWebアプリケーションを作成しようとしています。私はすでに正方形の写真を作るのにimagecopy()を使用しています。しかし、画像が大きすぎる場合は、imagecopyresized()でサイズを変更しようとしています。imagecopyのサイズを変更したPHP

$file = $_FILES['img']['tmp_name']; 
$filename = $_FILES['img']['name']; 
$size = 400; 
$destino = imagecreatetruecolor($size, $size); 
list($width, $height) = getimagesize($file); 
$correction = $size/2; 
$widths = $width/2 - $correction; 
$heights = $height/2 - $correction; 
$origen = imagecreatefromjpeg($file); 
$overflow = $size + 200; 

if($width > $overflow){ 
    $modified = $origen; 
    $ratio = $width/$height; 
    $growth = $width/$overflow; 
    $final = $overflow/$growth; 
    if($ratio > 1){ 
     $newwidth = $final * $ratio; 
    }else{ 
     $newwidth = $final/$ratio; 
    } 
    imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height); 
} 
imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size); 

ここでの問題は$overflowよりも大きい画像への変更はありませんということです:私はすでにこのコードを使用しました。

は、写真の元の寸法を維持し、変形を防止することです。

$growthは、画像が大きくなるほど、コピーされるインデックスです。

$finalは、成長指数をカウントとする最終幅です。

答えて

1

PHPがリソースをどのように処理するか、GD関数の仕組みについて間違った前提があります。上記の行はあなたに二つの別々の画像リソースを与えるものではありません

$modified = $origen; 

。メモリ内の同じイメージリソースを指し示す2つの変数を与えます。これは、一方の操作が他方の操作に反映されることを意味します。

これは、以下の行を持つ2つのミスを作るためにあなたが発生します。

imagecopyresized($origen, $modified, 0, 0, 0, 0, $final, $newwidth, $width, $height); 
  1. この関数は、先の画像($origen)またはソース画像($modified)のサイズは変更されません。ソースイメージ(つまり、コード内の指定された部分$modified)からコピーするイメージの部分のサイズを変更します。
  2. 機能は、このように、自身の上に画像のサイズを変更コピーを貼り付け、同じリソースへ$origen$modifiedポイントなので:

    moaning lisa doubled

最後に、あなたが呼び出す:

imagecopy($destino, $origen, 0, 0, $widths, $heights, $size, $size); 

問題は$widths$heightsは、の前に計算されますはサイズ変更されましたが、実際には問題は隠されています(前述のように)$origenのサイズが変更されていません!

moaning lisa squaredここ

は私が収まるように、入力画像のサイズを変更する方法を次のとおりです。

上記のすべての結果は、あなたに、正方形のように、元の画像の真ん中から「カット」を与えることですこれは、出力の最上位(風景画像)/底又は(ポートレイト画像の)左/右に黒いバーをもたらすこと

$file = $_FILES['img']['tmp_name']; 

$maxW = $maxH = 400; 
list($srcW, $srcH) = getimagesize($file); 
$ratio = $srcW/$srcH; 

$src = imagecreatefromjpeg($file); 
$dest = imagecreatetruecolor($maxW, $maxH); 

if ($ratio > 1) { 
    // landscape. 
    $destH = ($maxH/$ratio); 
    imagecopyresized($dest, $src, 0, ($maxH/2) - ($destH/2), 0, 0, $maxW, $destH, $srcW, $srcH); 
} else { 
    // portrait (or square). 
    $destW = ($maxW * $ratio); 
    imagecopyresized($dest, $src, ($maxW/2) - ($destW/2), 0, 0, 0, $destW, $maxH, $srcW, $srcH); 
} 
// now do whatever you want with $dest... 

注:400x400pxと中心その出力以内。これを変更するにはimagecopyresizedコールの前に、$destに色または透明度を入力するだけです。

+0

うわー!あなたは私の命を救いました!ありがとう! –

関連する問題