当サイトはAmazonアソシエイトとして、適格販売により収入を得ています。
Github Copilot / Claude / Chat GPTを使って既存のLaravelプロジェクト(おみくじとかを実装しているプロジェクト)に機能を追加してみたよ
だいたい、2時間くらいでできたんじゃないかな。慣れるともっと早くできそうだけどね
簡単な背景
ブログにアップする時に画像サイズがまちまちなのでなるべく揃えたい
またブログへのアップは1ファイルあたり2MB未満、かつフォーマットHEICは直接アップできない
という制約があって、いままでは1ファイル開いてはMac プレビューでリサイズを手動でやっていて面倒でした。
プロンプト(要件定義)
# ResizePhotos バッチコマンド 仕様書
## コマンド
php artisan batch:resize_photos {folder}
## 概要
Google Photosからブラウザで手動ダウンロードした写真・動画を、ブログ投稿用に自動でリサイズ・圧縮・ZIP化するバッチコマンド。
## 引数
`folder` : DOWNLOAD_BASE_DIR配下のフォルダ名(パスではなくフォルダ名のみ)
## 環境変数
.envにDOWNLOAD_BASE_DIRを定義する。未定義の場合は$HOME/Downloadsがデフォルト。
DOWNLOAD_BASE_DIR=/home/sail/Downloads
Sail環境ではdocker-compose.ymlにホストMacの~/DownloadsをコンテナのSail/home/sail/Downloadsにボリュームマウントして使用する。
## 処理フロー
1. 引数のフォルダ名から入力パスを生成し、フォルダの存在を確認する
2. 入力フォルダ内のファイルをすべて再帰的に走査する
3. ファイルのMIMEタイプを判定し、画像・動画・その他に振り分ける
4. 処理済みファイルを一時出力フォルダ(フォルダ名_resized)に保存する
5. 一時出力フォルダをZIP化する(フォルダ名_resized.zip)
6. 一時出力フォルダを削除する
## ファイル別処理
### 画像
- HEIC/HEIF形式はImageMagick(\Imagick)でPNGに変換してからGDで処理する
- その他の形式(JPEG、PNG等)はGDで直接読み込む
- 縦×横の面積が360,000px(約600×600相当)を超える場合、比率を保ってリサイズする
- PNG形式(圧縮レベル6)で保存する
- 保存後に2MB未満かチェックし、超過する場合は90%→80%→70%…と段階的に縮小して再保存する(最大5回)
- 5回リトライしても2MB超過の場合はそのまま保存してエラーログを出力する
### 動画
- リサイズ・変換なしでそのままコピーする
### その他
- スキップしてログに記録する
## 出力
- ZIPファイルの出力先:DOWNLOAD_BASE_DIR/フォルダ名_resized.zip
- 同名ファイルが存在する場合は連番を付与する(例:_1.zip、_2.zip)
## 必要な環境
- PHP拡張:GD、imagick
- ImageMagick(HEICサポート付き):apt-get install -y imagemagick
- メモリ制限:実行時に-1(無制限)に設定
## ログ
処理の開始・終了・各ファイルの処理結果・エラーをLaravelのLogファサードとコンソール出力の両方に記録する。
結果
元画像(2048*2048を1024*1024に縮小表示)

変換後画像(600*600)





