画像ファイルの拡張子正規化 2014-10-24 (Fri) 23:18

先日のこと、ファイルのリネーム中に誤ってpngとjpegのイメージが混在したフォルダの中のファイルの拡張子を全てばっさり削除するという、なんともお間抜けな事故が発生。

ファイル数が100個弱あるので、ビューアで一々開いてプロパティを確認し、拡張子を付け直すとかちょっと面倒くさい。

一括で拡張子を自動的に付け直してくれるツールがないかと探してみたが、あいにくズバリなものはみつけられなかった。

その代り、ImageMagick という画像を操作したり表示したりするための、コマンドラインで使えるツール群を発見。

identify.exe というコマンドで画像ファイルの情報が取得出来るので、 X-Finderのランチャで起動する画像ファイルの拡張子正規化スクリプトを書いた。

2017/03/01 追記

 処理に時間の掛かるバッチ処理を別プロセスで実行する の中でリライト

/*
選択された画像ファイルのformatをチェックし拡張子を正規化する

画像ファイルのformatチェックに ImageMagic(portable版) を使用
http://www.imagemagick.org/script/binary-releases.php#windows
http://www.imagemagick.org/script/escape.php
*/
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateFalse = 0, TristateTrue = -1, TristateUseDefault = -2;

var extAdjustTable = [ { magic: 'JPEG', ext: 'jpg' },
{ magic: '', ext: '' }
];

function extAdjust(magic){
for(var i = extAdjustTable.length; i--; ){
var t = extAdjustTable[i];
if(magic == t.magic) return t.ext;
}
return magic.toLowerCase();
}

var wsh = new ActiveXObject('WScript.Shell');
var shell = new ActiveXObject("Shell.Application");
var fs = new ActiveXObject('Scripting.FileSystemObject');
var batf = WScript.Env('Temp') + '\\' + fs.GetTempName() + '.bat';
var tmpf = WScript.Env('Temp') + '\\' + fs.GetTempName();
var cSel = WScript.Col(WScript.Env('Selected'));
var cmd = 'identify.exe -format "%%i:%%m:%%n\\n" '; // バッチで実行するので%をエスケープ
var folder = shell.NameSpace(fs.GetParentFolderName(cSel.Item(0)));
var stream = new ActiveXObject("ADODB.Stream");

// 画像ファイルの情報取得のバッチファイルを作る
var f = fs.OpenTextFile(batf, ForWriting, true, TristateUseDefault);
f.WriteLine('@echo off');
for(var i = 0; i < cSel.Count; i++){
f.WriteLine(cmd + '"' + cSel.Item(i) + '"');
}
f.Close();

// 作ったバッチファイルを実行
wsh.Run('cmd /c ' + batf + ' > ' + tmpf, 0, true);

// バッチファイルの実行結果を読み込んで拡張子を正規化
stream.Type = 2; // テキスト
stream.charset = 'utf-8'; // utf-8
stream.Open();
stream.LoadFromFile(tmpf);
for(var line; (line = stream.ReadText(-2));){
if(line.match(/^(.+):(.+):(.+)$/)){
var e = extAdjust(RegExp.$2);
if(fs.GetExtensionName(RegExp.$1) != e){
folder.ParseName(fs.GetFileName(RegExp.$1)).Name =
fs.GetBaseName(RegExp.$1) + '.' + e;
}
}
}
stream.Close();
fs.DeleteFile(batf);
fs.DeleteFile(tmpf);
// WScript.Echo('処理完了!');

※ identify.exe のパラメータの説明は これ。 (ちなみにここで使っているのはバージョン 6.8.9-6)
※ ソース中の赤字部分は identify.exeのパスを環境に応じて指定のこと。
※ pngとjpeg以外にbmpとgifも正規化を確認。他のフォーマットについては不明。

スクリプトの処理内容が、

1) 一時ファイルにバッチコマンド書き出す。
2) 1)のバッチファイルを実行。
3) 実行結果を読み込んで拡張子をリネーム。

みたいな感じなので、一度に大量のファイルを処理すると結構時間掛かります。(´・ω・`)y-~~~
関連記事

コメントの投稿

管理者にだけ表示を許可する

注意事項
基本的にこのブログはブログ主の備忘録です。

ブログの内容にはブログ主の主観や時には正確でない情報が含まれていることもあります。書いてある内容がすべての環境にあてはまることを保証するものでもありません。
また過去の記事の情報はそれが参照された時点では既に陳腐化していることもあります。

その辺をご理解の上で当ブログ内に書いてあることを試す場合は自己責任でお願いします。

万一何らかの損害が生じても責任は持てませんのであしからず!

記事内容の誤りの指摘、疑問点の回答などコメント頂けると助かります。
カレンダー
02 | 2017/03 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
ブログ内検索
カラーコードチェッカ
カラーコードの確認
入力例) #ffffff | blue
カテゴリ
最新記事
最新コメント
最新トラックバック
リンク
ブロとも申請フォーム

この人とブロともになる

メールフォーム

名前:
メール:
件名:
本文: