; potrace_auto2.ahk
;
; ▽ 概要
; bmp(またはpotraceが対応している画像ファイル)をアイコンにドロップすると、potraceを
; 使用して線画と彩色部分のパスを生成し、それぞれレイヤーに振り分けて1枚のsvgに合成します。
; svgファイルは、入力元画像と同じ場所に"同じファイル名.svg"として保存されます。
; ▽ 使い方
; potraceとIrfanviewのインストールが必要です。下記のパス設定と異なる場合は修正してください。
; Irfanviewはピクセル数取得に使うだけなので、Pluginセットのインストールは特に必要ありません。
; 実行ファイルのパスを修正したら、このファイルはinkscape.exeと同じ場所に置いてください。
; ショートカットやドロップで実行可能なランチャなどに登録してbmpをアイコンにドロップすれば
; サイズ入力ダイアログが開きます。
; 初期設定は100pになっています(pは%のp)。50pや33.333pといった指定もできますが、
; ピクセル数*(縮小率/100)の小数点以下は四捨五入されます。
; 絶対ピクセル数でも指定できますが、その場合縦横比は正確に合わせなければ保持されません。
; ピクセル数指定の場合は、640*480のようにして、単位は付けないで下さい。
; okボタンを押すと変換が始まり、終了するまで何もダイアログは表示しません。
; 変換が終わればInkscapeで変換されたファイルを開きます。
; ▽ 仕様
; 線画レイヤー(outline)はロックされています。彩色レイヤー(innnerfill)はグループ化が解除され
; 全パーツがバラバラの状態になっています。
; レイヤー名や色を変更するには":label"や"#"で検索してください。
; 2度続けて実行すると、2回目が失敗する場合があります。
#NoEnv
SendMode Input
; /* 実行ファイルのフルパスが異なる場合は修正してください */
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
potrace = C:\Potrace\potrace.exe
i_view = C:\Progra~1\IrfanView\i_view32.exe
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
IfNotExist, %i_view%
{
MsgBox, 16, error, %i_view% not found.
return
}else IfNotExist, %potrace%
{
MsgBox, 16, error, %potrace% not found.
return
}
If %0% = 0
{
MsgBox, 16, error, inputfile not found.
return
}
Loop %0%{
GivenPath := %A_Index%
Loop %GivenPath%{
LongPath = %A_LoopFileLongPath%
}
}
SplitPath, LongPath, name, dir, ext, noext
if ext not in bmp,pbm,pgm,ppm
{
MsgBox, 16, error, 使用できるのは[ *.bmp | *.pbm | *.pgm | *.ppm ]だけです。`nファイルのフルパス = %1%
return
}
IfExist, %dir%\%noext%.svg
{
MsgBox, 4401, ,既存の %dir%\%noext%.svg が有ります。`n上書きしますか?
IfMsgBox, OK
FileDelete, %dir%\%noext%.svg
else
return
}
InputBox, size, , Set size as Percentage or Width*Height px) of original. `n`ne.g.) 50p (or 1600*1200), , 340, 150, , , , ,100p
if ErrorLevel <> 0
return
IfInString, size, %A_Space%
StringReplace, size, size, %A_Space%, , A
; /* Get Image dimensions */
image_info = %A_Temp%\image_info.txt
IfExist, %image_info%
FileDelete, %image_info%
RunWait, "%i_view%" %1% /info=%image_info%
Loop
{
FileRead, all_text, %image_info%
if ErrorLevel <> 0
{
Sleep, 1000
continue
}
else
{
Sleep, 200
break
}
}
FileReadLine, pixels, %image_info%, 6
StringGetPos, pos_w, pixels, %A_Space%, L3
StringGetPos, pos_w_e, pixels, %A_Space%, L4
pos_w := pos_w+2
pos_w_e := pos_w_e+1-pos_w
StringMid, px_org_w, pixels, %pos_w%, %pos_w_e%
StringGetPos, pos_h, pixels, %A_Space%, L5
StringGetPos, pos_h_e, pixels, %A_Space%, L6
pos_h := pos_h+2
pos_h_e := pos_h_e+1-pos_h
StringMid, px_org_h, pixels, %pos_h%, %pos_h_e%
if size <>
{
IfInString, size, p
{
StringReplace, size, size, p,
px_w := Round(px_org_w/(100/size))
px_h := Round(px_org_h/(100/size))
matrix := Round(size/1000, 6)
}
else IfInString, size, *
{
StringGetPos, pos, size, *
StringMid, px_w, size, 1, %pos%
pos := pos+1
StringTrimLeft, px_h, size, %pos%
matrix := Round((px_org_w/px_w)/1000, 6)
}
}
else{
px_w = px_org_w
px_h = px_org_h
matrix = 0.1
}
cx := Round(px_w/2)
cy := Round(px_h/2)
if (px_h >= 430)
{
zoom := Round(430/px_h, 6)
if (695 <= (px_w*zoom))
zoom := Round(695/px_w, 6)
}
else if (px_w > px_h)
zoom := Round(695/px_w, 6)
else
zoom = 1.0
; /* potrace */
Run, %potrace% -s -W%px_w%pt -H%px_h%pt %1% -o %A_Temp%\outline.svg, , Hide
RunWait, %potrace% -s -W%px_w%pt -H%px_h%pt %1% -i -C#faf2df -o %A_Temp%\innerfill.svg, , Hide
; /* Make SVG */
FileAppend,
(
")
break
if RegExMatch(str, "(^[0-9]|)")<>1
continue
IfInString, str, ")
{
StringReplace, str, str, ,
(
%A_Space%%A_Space%
%A_Space%%A_Space%
%A_Space%%A_Space%%A_Space%%A_Space%
)
}
FileAppend, %str%`n
}
Sleep, 500
; /* outline.svg読み込み */
Loop, Read, %A_Temp%\outline.svg, *%dir%\%noext%.svg
{
str = %A_LoopReadLine%
if (str = "")
break
if RegExMatch(str, "(^[0-9]|)")<>1
continue
IfInString, str, ")
{
StringReplace, str, str, ,
(
%A_Space%%A_Space%%A_Space%%A_Space%
%A_Space%%A_Space%
)
}
FileAppend, %str%`n
}
; /* Run inkscape */
EnvSet, PATH, %A_ScriptDir%`;%A_ScriptDir%\python
EnvSet, LANG, en
EnvSet, TEMP, C:\Temp
Run, inkscape.exe "%dir%\%noext%.svg", %A_ScriptDir%
WinWaitActive, %noext%.svg - Inkscape
; /* Del TempFiles */
FileDelete, %image_info%
FileDelete, %A_Temp%\outline.svg
FileDelete, %A_Temp%\innerfill.svg
Sleep, 1000
return