質問編集履歴

1 メソッドの処理を変更

HiroakiYamada

HiroakiYamada score 6

2017/07/12 17:49  投稿

PHPで画像のリサイズ
PHPのGDで画像のリサイズをしているのですが、リサイズ後の画像が縦に伸びたり横に伸びたりで
うまくいきません。
やりたいこととしましては、プロフィール写真は160*200で、プライベート写真は250*200でリサイズしたいです。
コードはネットで見つけたものを多少修正しています。
以下にコードを記述しますので、どなたかご教授いただければと思います。
よろしくお願いします。
↓呼び出し元
```php
$photo_dir = '../photo/';
$photo_dir1 = '../photo_resize/';
// プロフィール写真
if (file_exists($photo_dir . $line['member_id'] . ".jpg")) {
   if (file_exists($photo_dir1 . $line['member_id'] . ".jpg")) {
       unlink($photo_dir1 . $line['member_id'] . ".jpg");
   }
   $srcPath = $photo_dir . $line['member_id'] . ".jpg";
   $dstPath = $photo_dir1 . $line['member_id'] . ".jpg";
   makeThumbnail($srcPath, $dstPath, 160, 200);
}
// プライベート写真
$photo2_dir = '../photo2/';
$photo2_dir1 = '../photo2_resize/';
if (file_exists($photo2_dir . $line['member_id'] . "_01.jpg")) {
   if (file_exists($photo2_dir1 . $line['member_id'] . "_01.jpg")) {
       unlink($photo2_dir1 . $line['member_id'] . "_01.jpg");
   }
   $srcPath = $photo2_dir . $line['member_id'] . "_01.jpg";
   $dstPath = $photo2_dir1 . $line['member_id'] . "_01.jpg";
   makeThumbnail($srcPath, $dstPath, 250, 200);
}
if (file_exists($photo2_dir . $line['member_id'] . "_02.jpg")) {
   if (file_exists($photo2_dir1 . $line['member_id'] . "_02.jpg")) {
       unlink($photo2_dir1 . $line['member_id'] . "_02.jpg");
   }
   $srcPath = $photo2_dir . $line['member_id'] . "_02.jpg";
   $dstPath = $photo2_dir1 . $line['member_id'] . "_02.jpg";
   makeThumbnail($srcPath, $dstPath, 250, 200);
}
if (file_exists($photo2_dir . $line['member_id'] . "_03.jpg")) {
   if (file_exists($photo2_dir1 . $line['member_id'] . "_03.jpg")) {
       unlink($photo2_dir1 . $line['member_id'] . "_03.jpg");
   }
   $srcPath = $photo2_dir . $line['member_id'] . "_03.jpg";
   $dstPath = $photo2_dir1 . $line['member_id'] . "_03.jpg";
   makeThumbnail($srcPath, $dstPath, 250, 200);
}
```
↓メソッド
```php
/* ----------------------------------------------------------
* 画像のサイズを変形して保存する
* ---------------------------------------------------------- */
function transformImageSize($srcPath, $dstPath, $width, $height)
{
   list($originalWidth, $originalHeight, $type) = getimagesize($srcPath);
   $diffW = '';  
   $diffH = '';  
   if($originalWidth > $originalHeight){  
       $diffW = $originalHeight;  
       $diffH = $originalHeight;  
   }elseif($originalWidth < $originalHeight){  
       $diffW = $originalWidth;  
       $diffH = $originalWidth;  
   }elseif($originalWidth === $originalHeight){  
       $diffW = $originalWidth;  
       $diffH = $originalHeight;  
   }  
   switch ($type) {
       case IMAGETYPE_JPEG:
           $source = imagecreatefromjpeg($srcPath);
           break;
       case IMAGETYPE_PNG:
           $source = imagecreatefrompng($srcPath);
           break;
       case IMAGETYPE_GIF:
           $source = imagecreatefromgif($srcPath);
           break;
       default:
           throw new RuntimeException("サポートしていない画像形式です: $type");
   }
   $canvas = imagecreatetruecolor($width, $height);
   //imagecopyresampled($canvas, $source, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
   imagecopyresampled($canvas, $source, 0, 0, 0, 0, $width, $height, $diffW, $diffH);
   imagecopyresampled($canvas, $source, 0, 0, 0, 0, $width, $height, $originalWidth, $originalHeight);
   imagejpeg($canvas, $dstPath, 100);
   imagedestroy($source);
   imagedestroy($canvas);
}
 
/* ----------------------------------------------------------
 * 内接サイズを計算する
 * ---------------------------------------------------------- */
 function getContainSize($width, $height, $containerWidth, $containerHeight)
 {
     if($containerWidth != 160){
         $ratio = $width / $height;
         $containerRatio = $containerWidth / $containerHeight;
         if ($ratio > $containerRatio) {
             return array($containerWidth, intval($containerWidth / $ratio));
         } else {
             return array(intval($containerHeight * $ratio), $containerHeight);
         }
     }else {
         return array($containerWidth, $containerHeight);
     }
     //return array($containerWidth, $containerHeight);
 }
/* ----------------------------------------------------------
 * 画像のサムネイルを保存する
 * ---------------------------------------------------------- */
function makeThumbnail($srcPath, $dstPath, $maxWidth, $maxHeight)
{
   list($originalWidth, $originalHeight) = getimagesize($srcPath);
   if ($maxWidth > $originalWidth && $maxHeight > $originalHeight) {  
       copy($srcPath, $dstPath);  
       return;  
   }  
 
   list($canvasWidth, $canvasHeight) = getContainSize($originalWidth, $originalHeight, $maxWidth, $maxHeight);
 
   // 元画像がリサイズするサイズより小さいときは元画像を使う  
   if($canvasWidth >= $originalWidth){  
       $canvasWidth = $originalWidth;  
   }  
   if($canvasHeight >= $originalWidth){  
       $canvasHeight = $originalHeight;  
   }  
   transformImageSize($srcPath, $dstPath, $canvasWidth, $canvasHeight);
}
 
```
  • PHP

    29174 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • GD(Graphics Library)

    28 questions

    GD(Graphics Library)は、線や多角形、円、テキストなどを書くことができるライブラリです。グラフなどを作成する際に利用されます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る