[Face-Wizard] 
 
 [Inkscape] 

 [Potrace] 
 
 [Tablet_Renew] 
 
 [MY_CGs] 
J Potraceでbmpをパスに変換



■ Potraceとは?
ラスター画像を高速でベクター画像に変換するツール。
2MBくらいの2bit-bmpであれば、ほぼ瞬時にベクタライズしてくれます。

入力形式 bmp pbm pgm ppm
出力形式 svg ps eps pgm
http://Potrace.sourceforge.net/で公開されています。

■ 関連リンク
4Many common questions are answered in the FAQ:
http://Potrace.sourceforge.net/faq.html

4Some examples are given on the following web pages:
http://Potrace.sourceforge.net/samples.html
http://Potrace.sourceforge.net/mkbitmap.html

4The inner workings of the Potrace algorithm are explained here:
http://Potrace.sourceforge.net/Potrace.pdf

4The Potrace library is documented here:
http://Potrace.sourceforge.net/Potracelib-2up.pdf
Potrace-1.8.win32-i386.zipを解凍すると、実行ファイルはmkbitmap.exeとpotrace.exeが有り、前者は4bit以上のbmpデータをモノクロ2値化するアプリケーションですが、プレビューしながら閾値を変えることが出来ないのでこちらはあまり使いません。(使ってみたときのメモ書き)

入力ファイルはたいていbmp形式を使う事になり、4bit以上のカラー画像でも色差がはっきりしていれば一応使えますが、前もってラスターツールで閾値を調整してモノクロ2値化し、画像ピクセル数も大きいほど変換精度が高くなります。
拡張子の付いていないファイル(AUTHORS,ChangeLog,COPYING,NEWS,README)やREADME.winは、プレーンテキストなので、そのままメモ帳にドロップして開けます(ただし英文。名前を変更で.txtに変換しても大丈夫です)。

■変換方法
potrace.exe(Win32版)は上の画像のようにコマンドプロンプトから実行するよりも、バッチファイルを作成して使ったほうが使い勝手が良いです(バッチの記述例は下記)。
potraceのパスをシステム環境変数に通しておけば、上の画像のように >potrace -s と入力したあと、svgに変換したいbmpをDos窓にドロップ -> Enterキーでも変換できます。

エクスプローラ上で実行ファイルにbmpを直接D&Dしても変換できますが、その場合デフォルトのパラメータでeps形式で出力されます。

何もパラメータを与えずに実行すると、以下のコマンドラインと同じ処理が行われます。
potrace -P letter -t2 -a1.0 -O0.2 -u10 -k0.5 -C#000000 -e -2 %1
内訳:用紙サイズletter、斑点を抑えるレベル2、αmax1.0、カーブ最適化許容値0.2、1unit pixelsあたりの量子化レベル10、blacklevel遮断0.5、Fill色は#000000、ポストスクリプト圧縮レベル2、入力ファイルと同じフォルダに同じファイル名.epsで出力

■コマンドラインスイッチ詳細
[ -a | -b ] の記述は、a,bいずれか1つのオプションを選択します。
※ハイフンに続く1文字目のアルファベットは大文字小文字を区別します。
出力形式
(初期値:eps)
[ -e | -s | -p | -g ]
※-e =*.eps, -s =*.svg, -p =*.ps, -g =*.pgm形式
出力ファイル名
[ -o <ファイルパス>\<ファイル名>.拡張子 ]
ポストスクリプト圧縮レベル
(初期値:2)
[ -2(level2) | -3(level3) | -c(無圧縮) | -q(ファイルサイズを最適化しない) ]
※eps or ps出力時のみ有効
用紙サイズ(※1)
(初期値:letter)
[ -P letter | -P ledger | -P legal | -P note | -P A0 | -P A1 | -P A2 |-P A3 | -P A4 | -P B4 |-P B5 | -P 11x17 | -P <dim>x<dim> | etc..]
※dim指定時の単位はin,cm,pt.
※-Pオプションはすべて、実際の用紙サイズよりx,yともに 2inch小さくなる(=余白 1inch)

たとえばletterは本来 8.5*11 inch(= 612*792 point)ですが、上下左右に1in(72pt)の余白をとって468*648ptの枠内に縦横比が保持収まる大きさで出力されます。
斑点を抑える
(初期値:2)
[ -t2 | -t5 | etc..]
αmax
(初期値:1.0)
[ -a1 | -a0.6 | etc..]
※値を1.0以下にすると角が出やすくなる
 値が小さすぎると、毛先が台形になったり
 緩いカーブが直線になってしまう
 カーブの頂点を角にするか曲線にするかの閾値?
 a0.0で全ノードがコーナーポイントに
 a1.333(最大値)で全ノードがスムースポイント
 
 http://Potrace.sourceforge.net/Potracelib-2up.pdf
 の6/7に詳細解説あり
カーブ最適化許容値
(初期値:0.2)
[ -O0.2 | -O0.1 | etc..]
※値を小さくするとアウトラインの合併が行われにくくなる
カーブ最適化off [ -n ]
※ベジェ曲線の併合を抑止する
 このオプションで"線の交点の潰れ"が軽減される
 かと思ったら、そう上手くはいきませんでしたorz
  -Oオプションとは併用出来ない(?)
1unit pixelsあたりの量子化レベル
(初期値:10)
[ -u10 | -u1 | etc..]
blacklevel遮断
(初期値:0.5)
[ -k0.5 | -k0.2 | etc..]
※2値化する閾値。k0.5は明度50%を境に2値化する。
 2値化したbmpでこのオプションを付けても意味がない。

※Frontend options
色調反転 [ -i ]
※このオプションを使うと黒地に白のオブジェクトが作成されるのではなく、入力ファイルの白い部分だけが、黒いオブジェクトとしてパスに変換される。

つまり -iオプションを付けて変換したものと -iオプションを付けずに変換したものをInkscapeで開き、2枚を合成すれば、閉じた線の内側が塗潰された絵を短時間かつ高精度で作成できる(スケーリングオプションが同じである事)。

※Frontend options
ガンマ補正
(初期値:2.2)
[ -G ]
※pgm出力時のみ有効
カラー
(初期値:#000000)
[ -C#000000 | -C#rrggbb | etc..]
出力解像度
(dpi)
[-72 | -r90 | -r350 | -r600 | etc..]
ここで言う出力解像度はビットマップデータの印刷解像度とは違い、出力されるサイズに影響する。
Potraceはビットマップを72dpiで読み込むため、スケーリングオプションを何も付けずに-r72で変換すると、変換後のサイズ(page width, page height)は

ビットマップのピクセル数pt

になる。
Windowsでは"1 point not 1 pixel"であるため、とりあえずpotrace -s -r72 %1 で変換し、ソースを開いて"pt"を"px"に置換してやればsvgサイズはビットマップと等しくなる。

またInkscapeは1pt=1.25px(90dpi)でsvgを読み込むので、potrace -s -r90 %1 で変換すれば"pt"->"px"の置換を行わなくてもサイズが一致する。
ただしビットマップサイズが4の倍数でなければ端数が出るため、四捨五入されて誤差が発生する。
ここに挙げたのはオプションの一部です。

(※1)
[ -W]および[ -H]でも用紙サイズを指定出来る(-Pオプションと併用しない)

例)
potrace -a0.8 -u6 -t4 -W1600pt -H1200pt -s %1

-Pオプションと異なり、こちらは正確な数値を設定しなければ縦横比が保持されません。
また数字に単位を付けないと印刷時のインチサイズになるので、たとえば -W1600 -H1200などと書いてしまうと、モニタ上では約14万*11万pixelsの超巨大画像になってしまいます(1度やってしまった 笑)。
単位は*in,*cm,*pt(pixelsはsvgやepsでは不可)が使えます(小数点以下は1/1000まで指定可)。

■ビットマップの大きさで出力するには
スケーリングオプションを付けないと、前述の通り468*648ptの枠内にフィットされてしまうので、等倍表示したときの見かけの大きさがオリジナルデータ(bmp)と全く合わなくなります。
またそれをInkscapeで開いてサイズをbmpと揃えるには、用紙枠と同じ大きさのオブジェクト(矩形)を背面に置いて、矩形の座標を0座標に合わせてからでないとサイズを合わせられません(ラスタデータのように最初からキャンバス=紙が存在しないので、そうしないと用紙に対する絵の大きさを保持したままサイズ変更ができない)。

ベクタライズした画像を再びラスターに書き戻したりラスタデータと合成する場合や、svgをブラウザで表示したときのサイズを指定する場合は、スケーリングオプションに続いてピクセル数を記述し、単位には取りあえずptを使います。

たとえばuxgaサイズで出力するならば、
potrace -W1600pt -H1200pt -s %1
というバッチを書き、bmpをbatにドロップして出力されたsvgをテキストエディタ(HTMLモードで編集出来るテキストエディタがbetter)で開くと
width="1600pt" height="1200pt" viewBox="0 0 1600 1200"

と書かれた行(論理行で5行目)があるので、"pt"をそのまま"px"に置換すればokです。
width="1600px" height="1200px" viewBox="0 0 1600 1200"

viewBox=に続く4つの数字は左から
rightMargin viewBox右端から用紙右端までのピクセル数(px指定時)
bottomMargin 同下端からから用紙下端までのピクセル数(px指定時)
viewBox Width viewBoxのWidth ピクセル数(px指定時)
viewBox Height viewBoxのHeight ピクセル数(px指定時)

の意味ですが、viewBox(WxH)はサイズを大きくしてもviewBox自体の表示サイズ(svgの用紙サイズ)が変わるのではなく、(仮に)その大きさで表示したときの見かけの大きさを示します。

早い話、viewBoxを大きくすればオブジェクトは縮んで表示されます。
viewBoxをモニタ画素数に置き換えると分かり易いかもしれません。
例えば
width="640px" height="480px" viewBox="0 0 640 480"
ならオブジェクト:viewBoxは1:1なので実ピクセル数で表示されます。

これを
width="640px" height="480px" viewBox="0 0 1280 960"
とすると、1辺あたりのドット数が2倍(1280*960)のモニタで640*480pxの画像を表示した状態になるわけですが、モニタの物理寸法(viewBox)は変化しないので、結果svgオブジェクトは半分のサイズで表示されます。
つまりwidth="320px" height="240px" viewBox="0 0 320 240"とした時と表示サイズは同じになります。

ただし前者はviewBoxに余白があるので、オリジナルサイズでパンしてもオブジェクトがフレームから外れにくくなりますが、後者はパンすると直ぐにフレームアウトしてしまいます。

デフォルトの設定で書き出したsvgでも、同様にテキストエディタでサイズや色を変更できます。
たとえば1600*1200pxのbmpをsvg形式で書き出して800*600pxでブラウザに表示したい場合、
potrace -s %1

で書き出すと、ソースの4行目以降が
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="468pt" height="351pt" viewBox="0 0 468 351"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by Potrace 1.8, written by Peter Selinger 2001-2007
</metadata>
<g transform="translate(0,351) scale(0.029250,-0.029250)"
fill="#000000" stroke="none">

のようになっています。これを先ほどと同じように"pt"を"px"に置換して目当てのピクセル数を代入すれば良いのですが、スケーリングオプションを付けなかった場合は論理行10行目のtransform属性の値も編集する必要があります。
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="800px" height="600px" viewBox="0 0 800 600"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by Potrace 1.8, written by Peter Selinger 2001-2007
</metadata>
<g transform="translate(0,600) scale(0.05,-0.05)"
fill="#000000" stroke="none">

"translate(0,600) scale(0.05,-0.05)"のtranslate(0,600)の部分にyと同じピクセル数、scale(0.05,-0.05)に縮小率%/1000の値を代入。この場合50%に縮小するので0.05になります。

■その他のスケーリングオプション
 -x<n> 用紙倍率 (例 -x2)
※svgは無効
 -S<n> ピクセルアスペクトレート y/x
 -A 用紙の向き(アングル)
 -M<n> 余白(4辺を同じ値)
単位はin,cm,pt
辺ごとに余白を指定する場合は
 -L<n>:左余白
 -R<n>:右余白
 -T<n>:上余白
 -B<n>:下余白
を使う
これらのサイズ的な設定は、ラスターデータと違って後でいくらでも変更可能なので、Inkscapeで行った方が良いかもしれません。



■バッチファイルの記述例
※バッチの書き方はあくまで一例です。
 オプションの値は絵の内容によって様々なため、この値が正解という物ではありません。

 以下の例はすべて、potrace.exeを C:\Potrace にインストールしているものとします。
▼バッチにドロップしたbmp(入力元)と同じ場所にsvgを作成
 (同名のファイルがあれば確認無しで上書きされます)
@echo off
rem potrace_αmax0.8・量子化6・斑点抑止4・svg出力
C:\Potrace\potrace -a0.8 -u6 -t4 -s %1

実行パスにスペースが含まれるときは
"C:\Documents and Settings\<ユーザー名>\デスクトップ\potrace" -s %1
のようにpotraceのパスを"(ダブルコーテイション)で囲う必要があります。
potraceは、入力ファイルのパスにスペースが含まれていても、%1は引用符で囲う必要はありません。
"%1"と書くと""D:\hoge.bmp""のように2重引用符になってしまうため変換に失敗します(ただし変数を使わずにファイルのフルパスで指定する場合は引用符必須)。

この例ではバッチにドロップされたファイルのフルパスが変数%1に格納され、入出力ファイルのパスを書かなくても同じ場所に同じファイル名.svgで出力されます。


▼mkbitmapで変換(拡大+2値化)し、そのファイルをpotraceに渡してsvg変換する例
(テンポラリにmkb_tmp.bmp、デスクトップにmkb_tmp.svgが作成されます)
@echo off
rem mkbitmap_ハイパス8・スケールx2・cubic・色差0.35
rem potrace_αmax0.8・量子化6・斑点抑止4・WxH=入力元の1/2のサイズでsvg出力
C:\Potrace\mkbitmap -f8 -s2 -3 -t0.35 %1 -o %Temp%\mkb_tmp.bmp
C:\Potrace\potrace -a1.0 -u10 -t2 -r288 -s %Temp%\mkb_tmp.bmp -o "%USERPROFILE%\デスクトップ\mkb_tmp.svg"
del /q %Temp%\mkb_tmp.bmp

(%Temp%はテンポラリの意。通常はC:\Tempです。)
この例ではバッチにドロップしたbmpを、mkbitmapで1辺を200%拡大して2値化してテンポラリに保存、それをpotraceで25%のサイズ(= 入力元の50%)のサイズでsvgに変換してデスクトップに書き出します。
(最後にテンポラリのmkb_tmp.bmpをゴミ箱に残さず削除)

-rオプションは-r72でピクセル等倍になる(pt -> pxを置換するものとして)ので、-r288で25%サイズになります(解像度を上げる=密度が上がる=見かけのサイズは縮小される)。

mkbitmapでの拡大サイズはpotraceでのパス変換精度に影響を与えますが、potraceの解像度オプションはパス変換精度に影響しません。
ただし用紙サイズの単位はptになっているため、あとでラスターデータに描き戻したい画像の場合はsvgの5行目のptをpxに置換する必要があります。

もしコピペして使われる場合は、メモ帳に貼り付けてpotrace.exeと同じフォルダに任意名で保存し、拡張子を.batに書き換えて使用して下さい(ページのソースを表示して<BR>タグを消す)。

バッチファイルは、ショートカットを "%USERPROFILE%"\SendTo\ に置いて"送る"で実行したり、直接アイコンにbmpをD&Dしても実行できます。

なおTweak UIなどを使用してデスクトップの場所を変更している場合、"%USERPROFILE%\デスクトップ"の場所はあくまで"C:\Documents and Settings\<username>\デスクトップ"になるためフルパスで指定するか環境変数を変える必要が有ります。


▼バッチにドロップしたbmpから、線画と彩色用2枚のsvgを作成する例
下記の例では、入力されたbmpから、線画をパスに変換した"outline.svg"と線画の白い部分だけをパスに変換した"innerfill.svg"という2枚のsvgをデスクトップに自動作成します。
この例では事前に(一時的に)システム環境変数にpotraceとinkscapeのパスを通し、カレント(作業ディレクトリ)を指定する事で実行ファイルのフルパスや出力先ディレクトリのパスは省略できます。
@echo off
cd /d "%USERPROFILE%"\デスクトップ"
set TEMP=C:\Temp
set LANG=en
set PATH=C:\Potrace;C:\Progra~1\Inkscape;C:\Progra~1\Inkscape\python
potrace -s %1 -o outline.svg
potrace -s -i -C#FAF2DF %1 -o innerfill.svg
cd /d C:\Progra~1\Inkscape
inkscape "%USERPROFILE%"\デスクトップ\outline.svg

この例では、innerfill.svgは線画以外の部分が肌色(#FAF2DF)で着色され、既に全パーツが独立したパスになっています(そのままだとグループ化されているのでグループ解除する)。
このバッチがinkscape.exeと同じ場所に置いてあれば、下から2行目のcd /d 〜は必要ありません。
逆に、画像と同じフォルダにバッチを置く(僕は普段そうしてます)場合は、cd /dで作業ディレクトリを指定しないとinkscapeの起動に失敗します(起動直後に強制終了する)。
バッチの場所がDドライブ等、inkscapeがインストールされているドライブと異なるような場合は /d が必須ですが、両者のインストール場所が同一のドライブならば /d オプションは不要です。
また、このバッチではPotraceとInkscape(とInkscapeディレクトリ内のpython)にしかPATHを通さないので、InkscapeでGimpにファイルを渡す拡張は動作しません。


このバッチを思いついて掲示板に書き込んだところ、有志の方がInkscapeの拡張としてPythonスクリプトを書いてくださいました(感謝!)http://wikiwiki.jp/inkscape/のTipsで配布されています。
拡張を.\share\extensionにコピーしてInkscapeを起動すると、普通にbmpファイルを読み込むだけで線画のパス化と彩色部分のパス化をしてくれます。


このバッチを書いたときに発見したのですが、用紙サイズが同じファイルかつ、用紙の4隅にノードがあれば(つまり用紙サイズと同じ矩形があれば)、インポートするときにInkscapeのツールバーやメニューバーにファイルをドロップするだけで位置を崩さずインポートできます(キャンバス領域にドロップすると、その場所にインポートしてしまいます)。

拡張を作って頂いたのでこのバッチはもはや不要ですが、もしバッチを使われる場合はオブジェクトが全てグループ化されていることにご注意ください(グループを解除するか[Ctrl]+グループ内選択しなければパスメニューの操作は行えません)。
また、上の例のままではsvgのフルパスに2バイト文字(スペース含む)が含まれてしまうので、"%USERPROFILE%"\デスクトップ" の部分を好みの場所に書き換えるか、Inkscapeで開いたらすぐに2バイト文字が含まれない場所に保存し直した方が良いと思います。

Inkscape用UWSCスクリプトのページに、svg変換前に縮小率を%指定して線画と彩色パーツをレイヤーに振り分けて自動合成するマクロが置いてあります。


▼バッチにドロップしたbmpを、パラメータを変えながら複数枚書き出して線画の状態をタブブラウザで比較する(下の例はFirefox使用)。

非常に高速(下記の連続変換でも手元の時計で2秒程度)で変換してくれるので、このようにいくつか変換パターンを用意して複数処理し、気に入ったものを使うようにする事もできます。
前述した -outputオプションで出力ファイルのパスやファイル名を指定すると、何故か家の環境では出力したsvgが構文エラー(eps出力では正常)となり開けなかったので、bmpをリネームしながらsvgに変換するようにしてあります ← Potrace.1.8で修正されました。
@echo off
set PATH=C:\Potrace;C:\Program Files\Mozilla Firefox
md %Temp%\potrace_tmp
cd /d %Temp%\potrace_tmp

rem αmax1.0/カーブ最適化0.2/量子化10/斑点抑止2/svg出力(初期値で変換)
rem svg変換の初期値 = potrace -a1.0 -O0.2 -u10 -t2 -k0.5
potrace -s %1 -o po_default.svg

rem αmax1.0/カーブ最適化0.001/量子化10/斑点抑止2/svg出力
potrace -a1.0 -O0.001 -u10 -t2 -s %1 -o po_a1.0_O0.001_t2.svg

rem αmax1.0/カーブ最適化0.05/量子化10/斑点抑止2/svg出力
potrace -a1.0 -O0.05 -u10 -t2 -s %1 -o po_a1.0_O0.050_t2.svg

rem αmax1.0/カーブ最適化0.1/量子化10/斑点抑止1/svg出力
potrace -a0.8 -O0.1 -u10 -t1 -s %1 -o po_a0.8_O0.100_t1.svg

rem αmax0.8/カーブ最適化0.5/量子化10/斑点抑止1/svg出力
potrace -a0.8 -O0.5 -u10 -t1 -s %1 -o po_a0.8_O0.500_t1.svg

rem cuteExecを使用してFirefoxの2重起動を抑止する(起動していなければ起動する)
rem cuteExec経由で起動させるプログラムはフルパス必須
C:\cuteExec\cuteExec "C:\Program Files\Mozilla Firefox\firefox.exe"

firefox po_default.svg
firefox po_a1.0_O0.001_t2.svg
firefox po_a1.0_O0.050_t2.svg
firefox po_a0.8_O0.100_t1.svg
firefox po_a0.8_O0.500_t1.svg


Rem〜行はすべて注釈で、パラメータの内容をメモしておけます。
これは最後に、出力されたsvgをすべてFirefoxの新しいタブで開く、までを自動実行します。

既にテンポラリに同名のファイルが有る場合は確認無しで上書きされます。
また、Firefox側の(拡張の)設定で、常に新しいタブで開くように設定しておく必要もあります。


このあと更に、マクロを使用して全てのタブの同じ位置を最大ズームすると便利なのですが、Zoomしたい座標は当然絵の内容によって異なるので其処だけは毎回記録するしかありません。
むしろマクロからバッチを呼び出せば、potraceでsvg変換〜ブラウザに表示してZoomまでの自動化が可能になると思い実際やってみた所、ケアレスミスなのかsvgが重いのか(100kb/file)、それともFirefoxとの相性問題なのか(どうもタブの切り替えが上手くいかない)、Delayを長めにしても、どうしても何枚かが最後のZoomで失敗する...(タブの切り替えを手動で行いさえすればZoomのマクロ操作はスムーズで、特にDelayを使わなくとも問題なく完了します)

複数のbmpを同時処理する場合にも入力ファイルのパスが必要で、ファイル名はワイルドカード*が使えます。
例えば
C:\Potrace\potrace -s *.bmp
というふうに書くと、バッチが置いてあるフォルダ内の全てのbmpを同じパラメータで変換します(この場合はバッチをダブルクリックで実行する)。





 PAGE TOP▲

Oct 15 2007