現在の言語: 日本語

戻る

imagepng / imagejpeg
画像関連

画像の縮小をする方法としてimagepngおよびimagejpegがあります。

[サンプル]

copy
$kind = 1;//0;//[0]png [1]jpg
$input_dir = "./img/";//変換元となる画像フォルダパス
$output_dir = "./img/out/";//変換先に出力する画像フォルダパス
$imageSize = 300;//px単位
//画像リサイズ変換処理
resizeImageCreateFromPngOrJpeg($kind, $input_dir, $output_dir, $imageSize);

//画像リサイズ変換処理
//kind:[0]png [1]jpg
//input_dir:変換元となる画像フォルダパス
//output_dir:変換先に出力する画像フォルダパス
//imageSize:px単位
function resizeImageCreateFromPngOrJpeg(int $kind, string $input_dir, string $output_dir, int $imageSize)
{
    $all_files = scandir($input_dir);
    $files = [];

    //指定したフォルダの画像ファイルID(拡張子がpngもしくはjpg)を取得する処理
    imageDir($kind, $input_dir, $files);

    if(count($files)==0)
    {
        echo "対象ファイルが存在しません。\n";
        return;
    }

    // 保存先フォルダがなければ作成する
    if (!is_dir($output_dir))
    {
        mkdir($output_dir, 0755, true);
    }

    //画像サイズ変更
    resizeImage($kind, $input_dir, $output_dir, $imageSize, $files);
}

//画像サイズ変更
function resizeImage(int $kind, string $input_dir, string $output_dir, int $imageSize, array &$files)
{
    $src_image = null;
    foreach ($files as $file) 
    {
        echo "file:$file\n";
        if(!file_exists($input_dir . $file))
        {
            echo "ファイルは存在しないので次のファイルを判定します。\n";
            continue;
        }
        $image_into = getimagesize($input_dir . $file);
        if($image_into === false)
        {
            if(($kind == 0 && $image_into[2] !== IMAGETYPE_PNG) || 
               ($kind == 1 && $image_into[2] !== IMAGETYPE_JPEG)
              )
            {
                echo "画像情報が誤っています。\n";
                continue;
            }
        }
        // 1. 画像をメモリに読み込む
        if($kind == 0)
        {
            $src_image = imagecreatefrompng($input_dir . $file);            
        }
        else
        {
            $src_image = imagecreatefromjpeg($input_dir . $file);
        }
        if (!$src_image) continue;

        // 2. リサイズ(例:幅300pxに固定し、比率は維持)
        $resized_image = imagescale($src_image, $imageSize);

        // 3. ファイル名を取得(元のファイル名と同じ名前で保存するため)
        $filename = basename($input_dir . $file);
        $save_path = $output_dir . $filename;

        // 4. 指定したフォルダに直接保存
        // imagepngの第2引数にパスを渡すと、ファイルとして書き出されます
        if($kind == 0)
        {
            //透過(アルファチャンネル)を維持したい場合
            //imagescale は基本的には透過を維持しますが、
            //より確実に透過設定を保持して保存したい場合は、保存前に以下の設定を入れるのが一般的です。
            //保存の直前に透過設定を維持する処理
            imagealphablending($resized_image, false);
            imagesavealpha($resized_image, true);
            imagepng($resized_image, $save_path);
        }
        else
        {
            imagejpeg($resized_image, $save_path);
        }

        // 5. メモリ解放
        imagedestroy($src_image);
        imagedestroy($resized_image);

        echo "保存完了: " . $save_path . "\n";
    }    
}
//指定したフォルダの画像ファイルID(拡張子がpngもしくはjpg)を取得する処理
//kind:[0]png [1]jpg
//input_dir:指定するフォルダパス
//files:取得したファイルIDの結果を格納する配列
function imageDir(int $kind, string $input_dir, array &$files)
{
    $all_files = scandir($input_dir);
    $files = [];

    $flg=0;
    foreach ($all_files as $file) 
    {
        $flg=0;
        if($kind==0)
        {
            // '/i' 修飾子をつけることで大文字小文字を区別せずに検索
            if (preg_match('/\.png$/i', $file)) 
            {
                $flg=1;
            }
        }
        else
        {
            //最も一般的な書き方(OR演算子)
            // (jpg|jpeg) で「jpg」または「jpeg」にマッチ
            //if (preg_match('/\.(jpg|jpeg)$/i', $file))

            //短く書く方法(量指定子 ?)
            // jpe?g で「jpg」と「jpeg」の両方にマッチ
            if (preg_match('/\.jpe?g$/i', $file)) 
            {
                $flg=1;
            }
        }
        if($flg==0)continue;
        $files[] = $file;
    }

}
copy
$kind = 1; //0; //[0]png [1]jpg
$input_dir = "./img/"; //Source image folder path
$output_dir = "./img/out/"; //Destination image folder path
$imageSize = 300; //Pixel units
//Image resizing process
resizeImageCreateFromPngOrJpeg($kind, $input_dir, $output_dir, $imageSize);

//Image resizing process
//kind:[0]png [1]jpg
//input_dir:Source image folder path
//output_dir:Destination image folder path
//imageSize:Pixel units
function resizeImageCreateFromPngOrJpeg(int $kind, string $input_dir, string $output_dir, int $imageSize)
{
	$all_files = scandir($input_dir);
	$files = [];
	
	//Get image file IDs (with extensions .png or .jpg) in the specified folder
	imageDir($kind, $input_dir, $files);
	
	if(count($files)==0)
	{
		echo "The target file does not exist.\n";
		return;
	}
	
	//Create the destination folder if it does not exist
	if (!is_dir($output_dir))
	{
		mkdir($output_dir, 0755, true);
	}
	
	//Resize the image
	resizeImage($kind, $input_dir, $output_dir, $imageSize, $files);
}
	
//Resize the image
function resizeImage(int $kind, string $input_dir, string $output_dir, int $imageSize, array &$files)
{
	$src_image = null;
	foreach ($files as $file)
	{
		echo "file:$file\n";
		if(!file_exists($input_dir . $file))
		{
			echo "The file does not exist, so try the next file.\n";
			continue;
		}
		$image_into = getimagesize($input_dir . $file);
		if($image_into === false)
		{
			if(($kind == 0 && $image_into[2] !== IMAGETYPE_PNG) ||
			($kind == 1 && $image_into[2] !== IMAGETYPE_JPEG)
			)
			{
				echo "The image information is incorrect.\n";
				continue;
			}
		}
		// 1. Load the image into memory.
		if($kind == 0)
		{
			$src_image = imagecreatefrompng($input_dir . $file);
		}
		else
		{
			$src_image = imagecreatefromjpeg($input_dir . $file);
		}
		if (!$src_image) continue;
		
		// 2. Resize (e.g., fix width to 300px, maintain aspect ratio)
		$resized_image = imagescale($src_image, $imageSize);
		
		// 3. Get filename (to save with the same name as the original)
		$filename = basename($input_dir . $file);
		$save_path = $output_dir . $filename;
		
		// 4. Save directly to a specified folder
		// Pass a path as the second argument to imagepng to write the file.
		if($kind == 0)
		{
			// If you want to preserve transparency (alpha channel)
			// imagescale generally preserves transparency,
			// To more reliably preserve transparency settings when saving, it's common to set the following before saving.
			// Maintain transparency settings immediately before saving.
			imagealphablending($resized_image, false);
			imagesavealpha($resized_image, true);
			imagepng($resized_image, $save_path);
		}
		else
		{
			imagejpeg($resized_image, $save_path);
		}
		
		// 5. Free memory.
		imagedestroy($src_image);
		imagedestroy($resized_image);
		
		echo "Saving completed: " . $save_path . "\n";
	}
}
// Obtain image file IDs (with extensions .png or .jpg) in the specified folder.
//kind:[0]png [1]jpg
//input_dir: Folder path to be specified.
//files: Array to store the obtained file IDs.
function imageDir(int $kind, string $input_dir, array &$files)
{
	$all_files = scandir($input_dir);
	$files = [];
	
	$flg=0;
	foreach ($all_files as $file)
	{
		$flg=0;
		if($kind==0)
		{
			// Use the '/i' modifier to perform a case-insensitive search.
			if (preg_match('/\.png$/i', $file))
			{
				$flg=1;
			}
		}
		else
		{
			// Most common syntax (OR operator)
			// (jpg|jpeg) matches "jpg" or "jpeg"
			//if (preg_match('/\.(jpg|jpeg)$/i', $file))
			
			// Shorter syntax (quantifier ?)
			// jpe?g matches both "jpg" and "jpeg"
			if (preg_match('/\.jpe?g$/i', $file))
			{
				$flg=1;
			}
		} 
		if($flg==0)continue; 
		$files[] = $file; 
	}

}
$all_files = scandir($input_dir);
指定したフォルダに存在するファイル情報を配列に返します。

if (preg_match('/\.png$/i', $file))
'/i' 修飾子をつけることで大文字小文字を区別せずに検索した結果を返します。

if (preg_match('/\.(jpg|jpeg)$/i', $file))
(jpg|jpeg) で「jpg」または「jpeg」にマッチした結果を返します。

if (preg_match('/\.jpe?g$/i', $file))
jpe?g で「jpg」と「jpeg」の両方にマッチした結果を返します。
preg_match で jpeg と jpg の両方にマッチさせるには、
正規表現の |(OR演算子) または ?(直前の文字が0回か1回)を使用します。

if (preg_match('/\.(png|jpg|jpeg)$/i', $file)) {
PNGもJPGもまとめて処理したい場合は上記のように判定することができます。

\.
ドットそのものを指します(エスケープ)。
(...|...)
括弧内のいずれかの文字列に一致(OR)。

e?
e が「0文字」または「1文字」存在することを指します。

$
文字列の最後であることを指定します(途中に .jpg が含まれるファイル名を除外するため)。

/i
大文字・小文字を区別しません。

is_dir($output_dir)
指定したフォルダが存在するかどうか?を判定します。

mkdir($output_dir, 0755, true);
指定したフォルダを作成します。

getimagesize($input_dir . $file);
画像の情報を取得します。

$image_into === false || $image_into[2] !== IMAGETYPE_PNG(jpgはIMAGETYPE_JPEG)
ファイルが有効でない場合の条件です。

imagescale
縦横比を維持したまま簡単にリサイズできます。
php version 5.5以降

basename
ファイル名部分のみを取得する関数です。
ここでは元のファイル名と同じ名前で保存するため、ファイル名を取得しています。

imagepng / imagejpeg
直接指定のフォルダへファイルとして書き出します。
第2引数が出力先の場所です。

透過(アルファチャンネル)を維持したい場合
imagescale は基本的には透過を維持しますが、より確実に透過設定を保持して保存したい場合は、保存前に以下の設定を入れるのが一般的です。

保存の直前に透過設定を維持する処理
imagealphablending($resized_image, false);
imagesavealpha($resized_image, true);
imagepng($resized_image, $save_path);



戻る

著作権情報
ホームページおよびアプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームページおよびアプリ等を利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。