読者です 読者をやめる 読者になる 読者になる

PPcからPNGファイルと、JPEGファイルの最適化

以前、各種PNG最適化ツールを一括で掛ける、BlastPNGというソフトを利用してたのだけど、公開停止になってしまった。

暫くはPPc上から

M_PNG    = {
最適化	=  pngrewrite %FDC %FDC
	   optipng -o7 %FDC
	   advpng -z4 %FDC
	   pngout %FDC /y
}

このように実行してたのだけど、PPbで最適化中はPPcがかなり重くなってしまう。

なので、思い切ってスクリプトにすることにした。

使うのは、pngrewriteoptipngadvpngpngoutjpegtranjpegoptim

M_PNG    = {
&pngrewrite->OptiPNG(lv2)->advpng(lv2)	= *script %0s\OptimizePNG.js,%a*8FDCN,1,2,2,0
&pngrewrite->OptiPNG(lv7)->advpng(lv4)->PNGout	= *script %0s\OptimizePNG.js,%a*8FDCN,1,7,4,1
}
M_JPG	= {
&EXIF情報の表示	= jhead %*name(CD,"%R","%1")
--	= 
JPEG&TRAN(最適化)	= *script %0s\OptimizeJPEG.js,%a*8FDCN,1,0
JPEG&OPTIM	= *script %0s\OptimizeJPEG.js,%a*8FDCN,0,1
TRAN+&OPTIM	= *script %0s\OptimizeJPEG.js,%a*8FDCN,1,1
}
==OptimizePNG.js==
//!*script
// 引数1:レスポンスファイル(%a*8FDCN)
// 引数2:pngrewrite (0/1)
// 引数3:OptiPNG    (0/1~7)
// 引数4:advpng     (0/1~4)
// 引数5:PNGout     (0/1)
if(PPx.Arguments.Length!=5){PPx.Quit();}

var skip    = 0;
var rewrite	= PPx.Arguments.Item(1);
var opti	= PPx.Arguments.Item(2);
var adv		= PPx.Arguments.Item(3);
var out		= PPx.Arguments.Item(4);
var pngrewrite	= 'Z:\\_t\\pngrewrite.exe';
var optipng	= 'Z:\\_t\\optipng.exe';
var advpng	= 'Z:\\_t\\advpng.exe';
var pngout	= 'Z:\\_t\\pngout.exe';

// レスポンスファイルを読み取り、配列へ格納
var PNGfile	= '';
var PNGfiles	= new Array();
var str		= new ActiveXObject('ADODB.Stream');
var ResponseFile	= PPx.Arguments.Item(0);
str.type	= 2;
str.charset	= 'utf-8';
str.open();
str.loadFromFile(ResponseFile);
while(!str.EOS){
	PNGfile = str.readText('-2')
	if(PNGfile.match(/\.PNG$/i)){
		PNGfiles.push(PNGfile);
	}
}
var FileCount = PNGfiles.length;
if(FileCount>5){
	skip	= !PPx.Execute('%QY"最適化済みフォルダはスキップ"');
}
str.close();

// 実行するか尋ねる
if(PPx.Execute('%QY"PNGファイル数:'+FileCount+' 実行しますか?"')){
	PPx.Quit();
}
// 実行ループ
var wsh		= new ActiveXObject('WScript.Shell');
var command	= '';
var rtnCode	= 0;
var bsize	= 0;
var asize	= 0;
var ssize	= 0;
var i2		= 0;
var dir		= '';
var skipdir	= '';
function check(exitcode){
	// 強制終了された場合はスクリプトの実行を止める
	if(exitcode<0){
		PPx.Execute('*execute C,*linemessage 強制終了'+exitcode);
		str = '';
		wsh = '';
		PPx.Quit();
	}
}
for (i=0;i<FileCount;i++) {
	if(dir!=PNGfiles[i].replace(/^(.*\\).*$/,"$1")){
		i2	= 0;
		ssize	= ssize + asize;
		asize	= 0;
	}
	dir	= PNGfiles[i].replace(/^(.*\\).*$/,"$1");
	PNGfile = '"' + PNGfiles[i] + '"';
	if(dir!=skipdir){
		i2++;
		skipdir = '';
		// 実行前ファイルサイズ記憶
		str.open();
		str.loadFromFile(PNGfiles[i]);
		bsize = str.size;
		str.close();
		if(rewrite!=0){
			command = pngrewrite
				+ ' '
				+ PNGfile
				+ ' '
				+ PNGfile;
			rtnCode = wsh.run(command,7,true);
			check(rtnCode);
		}
		if(opti!=0){
			command = optipng
				+ ' -o'
				+ opti
				+ ' '
				+ PNGfile;
			rtnCode = wsh.run(command,7,true);
			check(rtnCode);
		}
		if(adv!=0){
			command = advpng
				+ ' -z'
				+ adv
				+ ' '
				+ PNGfile;
			rtnCode = wsh.run(command,7,true);
			check(rtnCode);
		}
		if(out!=0){
			command = pngout
				+ ' '
				+ PNGfile
				+ ' /y';
			rtnCode = wsh.run(command,7,true);
			check(rtnCode);
		}
		// 減量サイズ記憶
		str.open();
		str.loadFromFile(PNGfiles[i]);
		asize = asize + (bsize - str.size);
		str.close();
		// ファイル処理数通知
		PPx.SetPopLineMessage('PNGファイル処理数:'+(FileCount-i-1)+'/'+FileCount);
		if(!(i%10)){ //窓を閉じた後にも時々通知
			PPx.Execute('*execute C,*linemessage PNGファイル処理数:'+(FileCount-i-1)+'/'+FileCount);
		}
		// 5ファイル最適化して変化なしは飛ばす
		if(i2==5&&!asize&&(skip==1||!PPx.Execute('%"'+dir+'"%QY"既に最適化済みのようです。このフォルダをスキップしますか?"'))){
skipdir = dir; } } } ssize = ssize+asize; if(PPx.Extract('%*windowrect(C,l)')<0){ //PPcが最小化状態 PPx.Execute('%I"PNGファイル最適化 終了しました。削減サイズ:'+Math.floor(ssize/1)+'B"'); } PPx.Execute('*execute C,*linemessage PNGファイル最適化 終了しました。削減サイズ:'+Math.floor(ssize/1)+'B'); str = ''; wsh = ''; PPx.Quit();
==OptimizeJPEG.js==
//!*script
// 引数1:レスポンスファイル(%a*8FDCN)
// 引数2:jpegtran  (0/1)
// 引数3:jpegoptim (0/1)
if(PPx.Arguments.Length!=3){PPx.Quit();}

var skip    = 0;
var tran	= PPx.Arguments.Item(1);
var optim	= PPx.Arguments.Item(2);
var jpegtran	= "Z:\\_t\\jpegtran.exe";
var jpegoptim	= "Z:\\_t\\jpegoptim.exe";

// レスポンスファイルを読み取り、配列へ格納
var JPGfile	= '';
var JPGfiles	= new Array();
var str		= new ActiveXObject('ADODB.Stream');
var ResponseFile	= PPx.Arguments.Item(0);
str.type	= 2;
str.charset	= 'utf-8';
str.open();
str.loadFromFile(ResponseFile);
while(!str.EOS){
	JPGfile = str.readText('-2')
	if(JPGfile.match(/\.(JPG|JPEG)$/i)){
		JPGfiles.push(JPGfile);
	}
}
var FileCount = JPGfiles.length;
if(FileCount>5){
	skip	= !PPx.Execute('%QY"最適化済みフォルダはスキップ"');
}
str.close();

// 実行するか尋ねる
if(PPx.Execute('%QY"JPGファイル数:'+FileCount+' 実行しますか?"')){
	PPx.Quit();
}
// 実行ループ
var wsh		= new ActiveXObject('WScript.Shell');
var command	= '';
var bsize	= 0;
var asize	= 0;
var ssize	= 0;
var i2		= 0;
var dir		= '';
var skipdir	= '';
for (i=0;i<FileCount;i++){
	if(dir!=JPGfiles[i].replace(/^(.*\\).*$/,"$1")){
		i2	= 0;
		ssize	= ssize + asize;
		asize	= 0;
	}
	dir	= JPGfiles[i].replace(/^(.*\\).*$/,"$1");
	JPGfile = '"' + JPGfiles[i] + '"';
	if(dir!=skipdir){
		i2++;
		skipdir = '';
		// 実行前ファイルサイズ記憶
		str.open();
		str.loadFromFile(JPGfiles[i]);
		bsize = str.size;
		str.close();
		if(tran!=0){
			command = jpegtran
				+ ' -optimize -copy none -outfile '
				+ JPGfile
				+ ' '
				+ JPGfile;
			wsh.run(command,0,true);
		}
		if(optim!=0){
			command = jpegoptim
				+ ' -strip-all '
				+ JPGfile;
			wsh.run(command,0,true);
		}
		// 減量サイズ記憶
		str.open();
		str.loadFromFile(JPGfiles[i]);
		asize = asize + (bsize - str.size);
		str.close();
		// ファイル処理数通知
		PPx.SetPopLineMessage('JPGファイル処理数:'+(FileCount-i-1)+'/'+FileCount);
		if(!(i%50)){ //窓を閉じた後にも時々通知
			PPx.Execute('*execute C,*linemessage JPGファイル処理数:'+(FileCount-i-1)+'/'+FileCount);
		}
		// 5ファイル最適化して変化なしは飛ばす
		if(i2==5&&!asize&&(skip==1||!PPx.Execute('%"'+dir+'"%QY"既に最適化済みのようです。このフォルダをスキップしますか?"'))){
skipdir = dir; } } } ssize = ssize+asize; if(PPx.Extract('%*windowrect(C,l)')<0){ //PPcが最小化状態 PPx.Execute('%I"JPGファイル最適化 終了しました。削減サイズ:'+Math.floor(ssize/1)+'B"'); } PPx.Execute('*execute C,*linemessage JPGファイル最適化 終了しました。削減サイズ:'+Math.floor(ssize/1)+'B'); str = ''; wsh = ''; PPx.Quit();