2016年9月16日金曜日

フォルダ内のBMPファイルだけをbmp2png(コマンドライン版)に渡して変換後にBMPだけ削除する

BMP形式の画像ファイルを作成しまくるプログラムを使っています。
その画像について以下の要求がありました。
  ・画質を劣化させずにファイルサイズを小さくしたい
  ・サムネイル表示したい

ZIPなどで圧縮してしまうとサムネイル表示が出来なくなってしまいます。
ZIPファイル内にある複数の画像のうち、最初の画像だけを表示するソフトなどはありますが、今回の用途ではZIPファイル内の複数の画像をすべてサムネイル表示する必要がありました。

BMPからPNGへの変換なら画質劣化がなく、PNG形式ならサムネイル表示が可能なのでbmp2pngというソフトを使って変換することにしました。

ついでに、変換したら元のBMPファイルは削除したいので、プログラムを作成しました。




<job>
<script>
;(function(){
arg = WScript.Arguments
len = arg.length
if(!len){ return WScript.Echo('フォルダをドラッグ&ドロップしてください')}
AXO = function(name){return new ActiveXObject(name)}
fs = AXO('Scripting.FileSystemObject')
shell = AXO('WScript.Shell')
gsf2 = fs.GetSpecialFolder(2)
Read = function(p){var o=fs.OpenTextFile(p), s=o.AtEndOfStream?'':o.ReadAll(); o.Close(); return s}
RAS = function(p){return Read(p).split('\r\n')}
fun = function(path){return path.indexOf(' ')<0 ? path : ('"'+path+'"')}
getFileList=function(path){
var pathTMP=gsf2+'/fileList', arr
shell.run('cmd /C dir /A-D /B '+path+' > '+fun(pathTMP), 0, true)
arr = fs.FileExists(pathTMP) ? RAS(pathTMP) : []
arr.pop()
return arr
}
for0L=function(arr,fun){for(var i=0,L=arr.length,res;i<L;i++){if(res=fun(i,arr[i])){return res}}}
pathExe = fun(fs.GetParentFolderName(WScript.ScriptFullName)+'/BMP2PNG.exe')
arrDir = []
for(i=0;i<len;i++){ arrDir[i] = arg(i) }
for0L(arrDir, function(i, path){
for0L(
getFileList(fun(path+'\\*.bmp')), // ←の「\」は「/」にしてしまうとdirコマンドが「/*.bmp」というスイッチだと誤認識してしまう
function(i, ファイル名){
var pathFile=path+'/'+ファイル名
shell.run(pathExe + ' ' + fun(pathFile),0,true)
fs.DeleteFile(pathFile)
}
)
})
})();
</script>
</job>
view raw bmp2png.wsf hosted with ❤ by GitHub


上記プログラムをメモ帳などにコピペして

「フォルダをこのファイルにドロップして.wsf」などのファイル名で保存して

wsfファイルと同じフォルダにvectorからダウンロードしたbmp2png.exeを移動して

先ほど作成した「~~.wsf」にBMP形式の画像ファイルが入っているフォルダをドラッグ&ドロップすれば

フォルダ内部のBMPが次々と、PNGに変換→BMP削除→PNGに変換→…となります。



ちなみに、圧縮前のBMPをZIP圧縮した場合と、BMPをPNGに変換した場合の容量を比較したら、ほとんど同等でした。

0 件のコメント:

コメントを投稿