星期二, 3月 29, 2011

 

Multi-threading 版 PNG 最佳化


Pingback 回去 XD

由於最近收圖有點兇,總是讓PNG優化工序超時完成,只好靠 Multi-threading 加快一下進度了。
和 scribe 的不同,我比較想用 batch 加外部工具達成,當然就是 *nix 眾都熟悉的 xargs

xargs 在 Windows 下有幾個版本: cygwin xargs、MSYS xargs、UnxUtils xargs、GnuWin32 xargs。
但是我試到最後,只有 cygwin xargs 的支援比較全面。

比 scribe 的我還增加了 "/b" 參數讓優化過程在標準以下的優先度下執行,不會讓你受打擾 XD

pngoutall_nproc.bat:
@echo off

SET PNGOPFX=%~dp0
SET CYGPFX=D:\cygwin\bin\

if NOT "%1"=="/r" GOTO pre2
SHIFT
SET DIRSW=/s

:pre2
if NOT "%1"=="/b" GOTO proc
SHIFT
SET POOSW=/b

:proc
dir /b %DIRSW% *.png | %CYGPFX%xargs.exe -d '\n' --max-args=1 -P %NUMBER_OF_PROCESSORS% %PNGOPFX%pngoptone.bat %POOSW%

SET DIRSW=
SET POOSW=
SET PNGOPFX=
SET CYGPFX=

pngoptone.bat:
@echo off

SET POOPFX=%~dp0

if NOT "%1"=="/b" GOTO PROC
SHIFT
SET EXECPFX=start /b /wait /belownormal

:PROC
 %POOPFX%binmay.exe -i "%~1" -o nul -s "00 00 00 08 61 63 54 4c" 2> nul
 if ERRORLEVEL 1 (
  %POOPFX%touch.exe -r "%~1" "%~1.time"
  %EXECPFX% %POOPFX%optipng.exe -zw32k -zc9 -zm9 -zs0,3 -f0,5 -i0 "%~1"
  if not ERRORLEVEL 1 (
   %EXECPFX% %POOPFX%advdef.exe -z -4 "%~1"
   %EXECPFX% %POOPFX%deflopt.exe -b "%~1"
   %EXECPFX% %POOPFX%pngout /y /b0 "%~1"
   if not ERRORLEVEL 2 (
    %EXECPFX% %POOPFX%advdef.exe -z -4 "%~1"
    %EXECPFX% %POOPFX%deflopt.exe -b "%~1"
   )
  )
  %POOPFX%touch.exe -r "%~1.time" "%~1"
  if exist "%~1.time" del "%~1.time"
 ) else (
  ren "%~1" "%~n1.apng"
 )

SET EXECPFX=
SET POOPFX=


backlink: 用 Python 跑 Multi-threading 版 PNG 最佳化

標籤:


留言

Cool! 這下我也可以不用Python了。
更重要的是,Below normal可以讓我邊上網/聽音樂邊處理XD

不過我只有使用UxUtil版的xargs,因為不用其他dll太方便。
只是沒有-d,所以找 find -print0 和 xargs -0 搭配。
不過後來發現傳進去的參數沒有"括"起來傳到批次檔,導致有空白的檔名會錯誤。

所以我只好用 find -printf "\"%f\"\0" 繞過這個問題。
---
少了Python多了find, xargs,應該是還划算。如果能依賴更少就更好了。
可是我不想自己寫一個 C 程式,還是算了。
 
*nix find 比 dir/b/s 慢喔…
 
我 hack 了一下 UnxUtils xargs 加了一些新 switch XD
http://rtfreesoft.blogspot.com/2011/04/my-enhanced-unxutils-xargs.html
 

發佈回應

發佈留言

留不了言?試試在這裡留吧。
回首頁