re:Inventの画像を簡単に掲載できるようにFFmpegを使って画像を一括で圧縮した件
re:Inventなどでイベントレポートを書く際に、画像の圧縮を手作業でやってて面倒になったのでカッとなって作りました
2024.12.03
こんばんは、リテールアプリ共創部のmorimorikochanです。
re:Inventが現在開催されており、社内や社外のre:Invent参加者はレポートを書くので忙しいのではないでしょうか
そんな中、弊社のブログ執筆環境では記事に添付できる画像1枚あたりのサイズ(容量)の上限が決まっています。
もし画像のサイズが大きいとユーザーが閲覧した際にローディング時間が長くなるのを抑制する目的だと思います。
ですが、最近のスマートフォンで撮影した写真は軽くこの上限を超えるため、いちいち手作業で画像を圧縮するのがとてもめんどくさいと私は感じていました。(特にセッションレポートなど画像が多いとなおさら)
そこで、一括でディレクトリ内の画像を圧縮するスクリプトを書いたので共有します。
# 初回のみ
brew install ffmpeg
# 対象ディレクトリに移動した後実行
cd target_directory
for f in **/*.JPG; do ffmpeg -i "$f" -q:v 18 ./min."$f"; done
-q:v 18
の数値部分を変更すると、圧縮比率が変わります。
高ければ高いほどより圧縮されるのでサイズは小さくなりますが、画像の品質も落ちます。
実行例
$ eza
Permissions Size User Date Modified Name
.rw-r--r--@ 25k morimorikochan 3 Dec 00:24 .DS_Store
.rw-r--r--@ 2.7M morimorikochan 3 Dec 00:04 IMG_0001.JPG
.rw-r--r--@ 2.8M morimorikochan 3 Dec 00:04 IMG_0002.JPG
.rw-r--r--@ 2.2M morimorikochan 3 Dec 00:04 IMG_0003.JPG
# ...多すぎるので省略
.rw-r--r--@ 2.5M morimorikochan 3 Dec 00:04 IMG_9997.JPG
.rw-r--r--@ 2.8M morimorikochan 3 Dec 00:04 IMG_9998.JPG
.rw-r--r--@ 2.5M morimorikochan 3 Dec 00:04 IMG_9999.JPG
$ for f in **/*.JPG; do ffmpeg -i "$f" -q:v 18 ./min."$f"; done
for f in **/*.JPG; do ffmpeg -i "$f" -q:v 18 ./min."$f"; done
ffmpeg version 7.1 Copyright (c) 2000-2024 the FFmpeg developers
built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)
configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/7.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox --enable-neon
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.100 / 61. 19.100
libavformat 61. 7.100 / 61. 7.100
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 4.100 / 10. 4.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
Input #0, image2, from 'IMG_0001.JPG':
Duration: 00:00:00.04, start: 0.000000, bitrate: 542210 kb/s
Stream #0:0: Video: mjpeg (Baseline), yuvj420p(pc, bt470bg/unknown/unknown), 4032x3024, 25 fps, 25 tbr, 25 tbn
Stream mapping:
Stream #0:0 -> #0:0 (mjpeg (native) -> mjpeg (native))
Press [q] to stop, [?] for help
Output #0, image2, to './min.IMG_0001.JPG':
Metadata:
encoder : Lavf61.7.100
Stream #0:0: Video: mjpeg, yuvj420p(pc, bt470bg/unknown/unknown, progressive), 4032x3024, q=2-31, 200 kb/s, 25 fps, 25 tbn
Metadata:
encoder : Lavc61.19.100 mjpeg
Side data:
ICC Profile
cpb: bitrate max/min/avg: 0/0/200000 buffer size: 0 vbv_delay: N/A
[image2 @ 0x12a704da0] The specified filename './min.IMG_0001.JPG' does not contain an image sequence pattern or a pattern is invalid.
[image2 @ 0x12a704da0] Use a pattern such as %03d for an image sequence or use the -update option (with -frames:v 1 if needed) to write a single image.
[out#0/image2 @ 0x600003e8c000] video:190KiB audio:0KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: unknown
frame= 1 fps=0.0 q=18.0 Lsize=N/A time=00:00:00.04 bitrate=N/A speed=0.442x
# ...繰り返し
今回は-q:v 18
で実行してみましたが、以下のような結果になりました。
ファイル名 | 圧縮前 | 圧縮後 |
---|---|---|
IMG_0001.JPG | 2.7MB | 194KB |
IMG_0002.JPG | 2.8MB | 247KB |
IMG_0003.JPG | 2.7MB | 165KB |
約1/10ほどのサイズになっていますね。
これぐらいであればブログに掲載しても大丈夫なはずです...!
これでみなさんのイベントレポート執筆環境が良くなれば幸いです