指定したファイル容量まで画像を圧縮する単機能アプリ的なものを作ったのでシェア。
少し前にMac用に作った機能のWindows版。
>>>Mac用のファイル容量指定 画像圧縮アプリはこちら
動作の概要
デスクトップに作った「画像自動圧縮フォルダ」
ここに写真ファイル(.jpg)を入れると。。。
圧縮したファイルが作られる。
・ファイル名の末尾に _700_50KB と追記
・最大700pxにサイズ縮小
・ファイルサイズを50KB以下になるまでサイズ圧縮
今回の写真だと
・「3968 x 2976」→「700 x 525」にサイズ変更
・「4.9MB(4900KB)」→「48KB」へ容量圧縮
フォルダに入れるだけなので余計な操作もなし。
複数の写真を一気に入れてもOK
なかな良いのもが出来ました。
フリーソフト?を4つ組み合わせる
画像変換アプリ、フォルダ監視アプリ、PowerShell、バッチファイルを組み合わせて作ります。
画像変換エンジンとしてImageMagickを使うのでインストールします。
>>>【ImageMagick公式サイト】
今回は最新だった「バージョン7.0.10-17 64bit用」を使いました。
32bit(x86)用ももうちょい下にいありました。
インストールとかは別サイトを参考に。
>>>「ImageMagick インストール Windows10」で検索
「フォルダ監視」はタスクトレイに常駐し、指定したフォルダに変化があったら指定プログラムを実行できるフリーソフト
>>>【窓の杜】フォルダ監視
インストール後、詳細設定にて監視するフォルダを指定する。
今回はデスクトップに作った「画像自動圧縮」フォルダを監視する。
監視する間隔は「10秒毎」
監視する対象は「.jpg」のみにした。チェックが外れてるけど多分入れないとダメ。
プログラムの起動設定では起動単位を「ファイル」に。プログラムは次の項で作るバッチファイルを指定。
パラメータは”「%FILENAME%”」
これで「画像自動圧縮フォルダ」に「.jpg」ファイルを入れると、10秒以内に「ファイルパスを引数としたバッチファイルが起動する」という状態になった。
次はバッチファイルとPowerShellスクリプトを作成する。
順番が前後するけど先にPowerShellスクリプトを作成。
適当な場所に「新しいテキストファイル」を作成しファイル名と拡張子を変更する。今回は下記にした。
C:\Users\{ユーザー名}\Documents\VSCode\jpgConvert.ps1
{ユーザー名}は自分の環境にあわせて読み替えてください。
ファイルの中を編集して保存する。
指定されたファイルが60,000B(60KB)より大きかったらimagemagickで700×700以下。50KB以下になるように圧縮。ファイル名を「元のファイル名_700_50KB.jpg」にして保存する。というスクリプト。
「$threshold = 60000」で元々60000Bより小さいファイルは無視するようにしています。
$input_file_path = $Args[0]
if (!Test-Path $input_file_path) {
exit
}
$output_file_path = $input_file_path -replace ".jpg", "_700_50KB.jpg"
$size = $(Get-Item $input_file_path).Length #ファイルサイズ
$threshold = 60000 #最大サイズ
If( $size -gt $threshold ){
magick.exe $input_file_path -strip -resize 700x700 -define jpeg:extent=50KB $output_file_path
}
写真の最大サイズは「-resize 700×700」、容量は「jpeg:extent=50KB」で指定。
他にもめちゃくちゃ沢山のプションがあるので気になる人はチラ見してみてください。
>>>【公式】imagemagickの変換オプション
「フォルダ監視」からはバッチファイルしか起動できなさそうなので先程作ったPowerShellスクリプトを実行するバッチファイルを作成する。
このファイルは「フォルダ監視」の「プログラム」で指定したファイルになるので「新しいテキスト」ファイルの名前、拡張子を変更する。
C:\Users\{ユーザー名}\Documents\VSCode\run.bat
{ユーザー名}は自分の環境にあわせて読み替えてください。
中身を編集する。
powershell -ExecutionPolicy Unrestricted -File C:\Users\{ユーザー名}\Documents\VSCode\jpgConvert.ps1 %1
先程作ったPowerShellスクリプトを実行しているだけです。
まとめ
これで
「画像圧縮フォルダにファイルを入れる」
⬇
「フォルダ監視がファイル名をバッチファイルに通知」
⬇
「バッチファイルからPowerShell起動」
⬇
「PowerShellからImageMagickで画像変換」
という流れができました。
フォルダにブチ込むだけなので手間もなくいい感じ。
多少気になる点もある。
・「タスクトレイ常駐&10秒毎監視」 が嫌。リアルタイムで実行したい。グループポリシーでフォルダの監査→タスクスケジューラでイベントビューアをトリガにしたスクリプト起動 というのをしたかったがうまく監査が出来ず断念。
・バッチファイルからimagemagickを直接動かしたほうがシンプルなんだけどファイルパスとかファイル容量の取得とか色々面倒だったのでPowerShellで作ったら「フォルダ監視」から起動できなかった。
・imagemagickの「-strip」オプションを入れないと一部の写真が異常に劣化するバグ?があった。「-strip」は画質には関係ないオプションのようだけど理由は不明。
-strip
strip the image of any profiles, comments or these PNG chunks: bKGD,cHRM,EXIF,gAMA,iCCP,iTXt,sRGB,tEXt,zCCP,zTXt,date.
とりあえず快適になったので参考まで。