2012-01-23 32 views
3

この機能を完了しようとしていますが、1つの小さな問題を除いてはうまく動作しているように見えます。画像を左に大きく移動し、 。サイズ変更された画像に黒い四角が入っています

私がしようとしているのは、指定された$ thumb_wにイメージのサイズを変更する機能です。サイズが変更された後に$ thumb_hより大きくなった場合、底部が切り抜かれます。

HERESに私の機能コード:

function resize_upload ($tmp, $thumb_w, $thumb_h, $img_name, $img_ext, $img_path) 
{ 
    if ($img_ext == 'jpg' || $img_ext == 'jpeg' || $img_ext == 'png' || $img_ext == 'gif') 
    { 
     if ($img_ext == 'jpg' || $img_ext == 'jpeg') 
      $source_img = imagecreatefromjpeg($tmp); 
     else if ($img_ext=='png') 
      $source_img = imagecreatefrompng($tmp); 
     else 
      $source_img = imagecreatefromgif($tmp); 

     $orig_w = imagesx($source_img); 
     $orig_h = imagesy($source_img); 

     $w_ratio = ($thumb_w/$orig_w); 
     $h_ratio = ($thumb_h/$orig_h); 

     if ($orig_w > $orig_h) 
     { 
      $crop_w = round($orig_w * $h_ratio); 
      $crop_h = $thumb_h; 
      $src_x = ceil(($orig_w - $thumb_w)/2); 
      $src_y = 0; 
     } 
     elseif ($orig_w < $orig_h) 
     { 
      $crop_h = round($orig_h * $w_ratio); 
      $crop_w = $thumb_w; 
      $src_x = 0; 
      $src_y = ceil(($orig_h - $thumb_h)/2); 
     } 
     else 
     { 
      $crop_w = $thumb_w; 
      $crop_h = $thumb_h; 
      $src_x = 0; 
      $src_y = 0; 
     } 

     $thumb_img = imagecreatetruecolor($thumb_w,$thumb_h); 

     imagecopyresampled($thumb_img, $source_img, 0 , 0 , $src_x, $src_y, $crop_w, $crop_h, $orig_w, $orig_h); 

     imagejpeg($thumb_img, $img_path.'/'.$img_name.'.'.$img_ext, 100); 

     imagedestroy($thumb_img); 
     imagedestroy($source_img); 
    } 
} 

はHERESに私は関数を呼び出す方法:

resize_upload ($_FILES['image_main']['tmp_name'], 556, 346, $img_name, $img_ext, '../wp-content/themes/my-theme/images/projects'); 

HERESにどのようなイメージが機能した後のように見える終わると、そのことを行います。

enter image description here

右側の黒を参照してください。おそらく私は理解できないいくつかの数学の問題です。どんな助けでも大歓迎です。

答えて

4

あなたの投稿$thumb_w = 556, $thumb_h = 346と同じ変数を使用して、送信された画像が正確に同じ大きさであるため、サイズを変更する必要がないとします(556x346)。

$orig_w = 556; 
    $orig_h = 346; 

    $w_ratio = 1; 
    $h_ratio = 1; 

    if (556 > 346) //true 
    { 
     $crop_w = round(556 * 1); // 556 
     $crop_h = 346; 
     $src_x = ceil((556 - 346)/2); // ceil(210/2) == 105; 
     $src_y = 0; 
    } 

    ... 

    $thumb_img = imagecreatetruecolor(556, 346); 

    imagecopyresampled($thumb_img, $source_img, 0, 0, 105, 0, 556, 346, 556, 346); 

だからあなたのコードは、ソース画像のx = 105で始まり、そしてその右に556個のピクセルを行くしようとするが、唯一の451ピクセルは、そのポイントを過ぎて存在しています。したがって、556x346の画像を送信した場合は、画像の水平部分のピクセル105〜556の幅をコピーし、垂直の0〜346のピクセルの幅をコピーします。したがって、画像の垂直部分全体が表示されますが、すべての部分が表示されるわけではありません。

私たちが幅よりも大きな高さの画像でこれらの同じ計算を行っても、画像の下部に黒いスペースがあるという同じ問題があると思います。

ヒント:多くの計算を必要とする数式などを書くときは、最も簡単な数値で最初に進んでください。それらがうまくいかなければ、あなたは明らかに何か間違ったことをしました。

+0

ありがとうございました。私は事を説明してくれたことを嬉しく思ったので、私は実際に正しいコードを与えるよりも、実際にそれらについて考える必要がありました。 – scarhand

関連する問題