ソフトモヒカンの勉強と開発の記録

サービス開発を目指して、プログラミングの勉強とコーディングをしています。本ブログは、そのログになります!

【PHP】2種類の連番画像ファイルをそれぞれ別サイズにリサイズする

連番になっていて、かつ、ファイル名が2種類に分けられている画像ファイル群をそれぞれ別のサイズにリサイズしたい!

開発環境

macOS High Sierra(バージョン10.13.5)
PHP7.1.16
Sublime Text

前提条件

以下で作成した関数をさっそく使いたいと思います。
【PHP】画像ファイルのリサイズをする関数の作成 - ソフトモヒカンの勉強と開発の記録


以下の設定で、画像を2種類のサイズにリサイズしたいと思います

  • 元画像のサイズは任意とする
  • 元の画像ファイルは全て「images」ディレクトリ内に置かれている
  • 画像ファイル名は、「xxxx_yy.拡張子」、「xxxx_pyy.拡張子」の2種類のルールで置かれている
  • xxxxは画像を示す名前(例:picFamily、picStarsなど)とする
  • yyは連番数字。pyyはp+連番数字とする(例:picFamily_1.jpg、picFamily_p2.png
  • pのありなしで、画像ファイルのリサイズを2通りに分けるものとする
  • リサイズした画像ファイルは、「images_resized」ディレクトリを作成して、そこに置く

プログラミング

以前に作成した関数になります。画像をリサイズして、リサイズしたファイルを指定したディレクトリに保存します。
今回は、このファイルを「imageReseze_func.php」という名前で使用します。

<?php
function image_resize($width_resized, $origin_path, $imagefile, $resize_path){
      /** width_resized:リサイズ後の画像ファイルの横幅
         orgin_path:リサイズする元画像ファイルのパス
            imagefile:画像ファイル名
            resize_path:リサイズ済みの画像ファイルの保存先パス **/

    //元の画像情報(横幅、縦、拡張子)を取得
    list($width_origin, $height_origin, $type) = getimagesize($origin_path.$imagefile);

    //画像を加工前にフォーマットごとに書き出し
    switch ($type) {
    case IMAGETYPE_JPEG:
        $image_origin = imagecreatefromjpeg($origin_path.$imagefile);
        break;
    case IMAGETYPE_PNG:
        $image_origin = imagecreatefrompng($origin_path.$imagefile);
        break;
    default:
        throw new RuntimeException('対応していないファイル形式です。: ', $type);//jpg、png以外は処理中止
    }

    /** アスペクト比を固定して、リサイズ後の縦の長さを算出
      リサイズ後の横幅は、function image_resizeを実行時に引数として指定済み **/
    $height_resized = ($height_origin / $width_origin) * $width_resized;

    // 新しく描画するキャンバスを作成
    $canvas = imagecreatetruecolor($width_resized, $height_resized);

    //$canvasオブジェクトに画像をリサイズしてコピー
    imagecopyresampled($canvas, $image_origin,0,0,0,0, $width_resized, $height_resized, $width_origin, $height_origin);

    //$canbasオブジェクトを$resize_pathに出力
    switch ($type) {
        case IMAGETYPE_JPEG:
            imagejpeg($canvas, $resize_path.$imagefile);
            break;
        case IMAGETYPE_PNG:
            imagepng($canvas, $resize_path.$imagefile);
            break;
    }

    // 読み出したファイルは消去
    imagedestroy($image_origin);
    imagedestroy($canvas);
}
?>


以下が、メインのファイルになります。
ファイル名で2種類に分けてリサイズします。

<?php
	//画像リサイズ関数のPHPファイルの読み込み
	require "imageResize_func.php";

	//リサイズした画像の置き場所の確認と作成
	$dir_resized = './images_resized/';
	if(!file_exists($dir_resized)){
		    if(mkdir($dir_resized, 0777, true)){
				echo $dir_resized."フォルダ作成成功";
		    }else{
		    	echo $dir_resized."フォルダ作成失敗";
		    }
	}else{
		echo $dir_resized."フォルダはすでに存在";
	}

	//ディレクトリ内のファイル名一覧の取得
	$dir = './images/' ;//ファイルのバス
	$filename = [];//ファイル名一覧の格納配列
	if( is_dir( $dir ) && $handle = opendir( $dir ) ) {//ディレクトリが存在する&開くことが可能である
		while( ($file = readdir($handle)) !== false ) {
			if( filetype( $path = $dir . $file ) == "file" ) {
				$filename[] = $file;
			}
		}
	}

	/** 正規表現を用いて、p付きか、pなしかを判別
              pなしは300px、p付きは600pxへリサイズ **/
	$cnt_file = count($filename);
	$pattern_size = '/_p.*\..*/';
	for( $i = 0; $i < $cnt_file; $i++ ){
		if( preg_match($pattern_size, $filename[$i]) ){
			image_resize(300, $dir, $filename[$i], $dir_resized);//引数:リサイズサイズ(px)、元ファイルのパス、元ファイル名、リサイズファイルの保存先パス
		}else{
			image_resize(600, $dir, $filename[$i], $dir_resized);//引数:リサイズサイズ(px)、元ファイルのパス、元ファイル名、リサイズファイルの保存先パス
		}
	}
?>