現在の言語: 日本語

戻る

Mac専用コマンド sips
画像関連

拡張子はpngでもデータ形式がavifだった場合に変換する方法です。
PNGサポートがOKなのに Imagick でエラーが出る場合、
画像に含まれる独自のプロファイルが Imagick と相性が悪い可能性が高いです。
Macのプレビューで開けるのであれば、
Mac標準の sips (Scriptable Image Processing System) を使うのが一番確実です。
Macの「プレビュー」アプリと同じ仕組みで動くため、プレビューで開ける画像なら必ず処理できます。
ImagickやGDのライブラリ不足に悩まされることがありません。
OSレベルで最適化されています。

[サンプル]

copy
outputResizeImage();
//画像リサイズ出力
function outputResizeImage()
{
	$kind=0;
	$input_dir = '../img/';   
	$output_dir = '../img/out/'; 
	$imageSize = 300;
	resizeImageMacOnly($kind, $input_dir, $output_dir, $imageSize);
}
function resizeImageMacOnly(int $kind, string $input_dir, string $output_dir, int $imageSize)
{
	$files=[];
	getImageDir($kind, $input_dir, $output_dir, $files);
	if(count($files)==0)
	{
		echo "対象ファイルが存在しません。";
		return;
	}
	// 保存先フォルダがなければ作成する
	if (!is_dir($output_dir))
	{
		mkdir($output_dir, 0755, true);
	}
	$absPathOut="/Applications/MAMP/htdocs/img/";
	convertImageSize($input_dir, $output_dir, $files, $imageSize, $absPathOut);
}
function convertImageSize(string $input_dir, string $output_dir, array &$files, int $imageSize, string $absPathOut)
{
	// 出力先ディレクトリの絶対パスを確実に取得
	$abs_out_base = realpath($output_dir);
	
	foreach ($files as $file) 
	{
		$in_file = $input_dir . $file;
		$abs_input = realpath($in_file);

		if (!$abs_input || !$abs_out_base)
		{
			echo "パスエラー: 入力または出力フォルダが見つかりません。\n";
			continue;
		}

		// 出力先のフルパスを正しく結合(outフォルダの中のファイル名)
		$abs_output = $abs_out_base . '/' . $file;

		// コマンドの組み立て
		// 注意:--out の後の半角スペースと変数 $abs_output を確実に含める
		$command = "sips --setProperty format png --resampleWidth " . (int)$imageSize . " " . escapeshellarg($abs_input) . " --out " . escapeshellarg($abs_output);

		echo "実行コマンド: " . htmlspecialchars($command) . "\n";

		$exec_log = [];
		$return_var = 0;
		
		// 第2引数は配列、第3引数は変数
		exec($command . " 2>&1", $exec_log, $return_var); 

		if ($return_var === 0)
		{
			echo "成功: $file\n";
		}
		else
		{
			echo "失敗 (コード: $return_var)\n";
			echo "詳細情報: " . implode("<br>", $exec_log) . "\n";
		}
	}
}
function getImageDir(int $kind, string $input_dir, string $output_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
outputResizeImage();
//Resize image output
function outputResizeImage()
{
	$kind=0;
	$input_dir = '../img/';
	$output_dir = '../img/out/';
	$imageSize = 300;
	resizeImageMacOnly($kind, $input_dir, $output_dir, $imageSize);
}
function resizeImageMacOnly(int $kind, string $input_dir, string $output_dir, int $imageSize)
{
	$files=[];
	getImageDir($kind, $input_dir, $output_dir, $files);
	if(count($files)==0)
	{
		echo "The target file does not exist.";
		return;
	}
	//Create the destination folder if it does not exist.
	if (!is_dir($output_dir))
	{
	mkdir($output_dir, 0755, true);
	}
	$absPathOut="/Applications/MAMP/htdocs/img/";
	convertImageSize($input_dir, $output_dir, $files, $imageSize, $absPathOut);
}
function convertImageSize(string $input_dir, string $output_dir, array &$files, int $imageSize, string $absPathOut)
{
	// Ensure absolute path of output directory is obtained.
	$abs_out_base = realpath($output_dir);
	
	foreach ($files as $file)
	{
		$in_file = $input_dir . $file;
		$abs_input = realpath($in_file);
		
		if (!$abs_input || !$abs_out_base)
		{
			echo "Path error: Input or output folder not found.\n";
			continue;
		}
	
		// Correctly combine the full output path (filename in the out folder).
		$abs_output = $abs_out_base . '/' . $file;
		
		// Assembling the command
		// Note: Be sure to include a space after --out and the variable $abs_output.
		$command = "sips --setProperty format png --resampleWidth " . (int)$imageSize . " " . escapeshellarg($abs_input) . " --out " . escapeshellarg($abs_output);
		
		echo "Command to execute: " . htmlspecialchars($command) . "\n";
		
		$exec_log = [];
		$return_var = 0;
		
		// The second argument is an array, and the third argument is a variable.
		exec($command . " 2>&1", $exec_log, $return_var);
	
		if ($return_var === 0)
		{
			echo "Success: $file\n";
		}
		else
		{
			echo "Failed (Code: $return_var)\n";
			echo "More information: " . implode("<br>", $exec_log) . "\n";
		}
	}
}
function getImageDir(int $kind, string $input_dir, string $output_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 way (quantifier ?)
			// jpe?g matches both "jpg" and "jpeg"
			if (preg_match('/\.jpe?g$/i', $file))
			{
				$flg=1;
			}
		}
		if($flg==0)continue;
		$files[] = $file;
	}

}
--setProperty format png
sipsに対して「中身が何であれ、出力は強制的にPNG形式にする」と明示的に指示を出します。

[中身の変換]
AVIF形式の画像データを、PNG形式のデータに再構築します。
[不整合の解消]
出力ファイル名(.png)と中身(PNGデータ)を正しく一致させます。


戻る

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