"妄想ノートなラクガキ帳

10/12

2013

mypotrace(potraceフロントエンド) python版

お絵かき potrace

コメント:0 TB:0


カテゴリが一つしか選べないのがfc2の弱点。
とりあえず、pythonにしておきます。

さて以前置いておいたbashによるpotraceフロントエンド、mypotraceですが。
久々に、お絵かきした絵を通してみたらエラー発生しましたw
どうも、一枚しか無いTIFには適合しない模様。
それで修正しようと思ったのですが、もはや何がなんだかわからない…
やはりシェルスクリプトでは無理があったようです。
それでpythonで全面的に描き直しました。



#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import os
import subprocess
import glob
import shutil

class ArgumentGenerator:


def __init__(self):
self.args={}
self.argtable={
"--blacklevel" : "-k",
"--turdsize" : "-t",
"--longcurve" : "-n",
"--opttolerance" : "-O",
"--unit" : "-u" }

# adding key thorugh
for ck in self.argtable.keys():
self.argtable[self.argtable[ck]]=self.argtable[ck]


def get_arg(self):
ret=[]
for ck in self.args:
ret.append(ck)
ret.append(str(self.args[ck]))
return ret

def add(self,arg,value):
self.args[self.argtable[arg]]=value

def process_potrace(arg_src,ifname,ofname):

args=['potrace']
args+=arg_src.get_arg()
args.append('-s')
args.append(ifname)
subprocess.check_call(args)
if ofname!=None:
indir,inbase,inext=get_fnames(ifname)
tout="%s/%s.svg" % (indir,inbase)
print("output vector file %s" % ofname)
shutil.move(tout,ofname)

def get_fnames(ifname):
indir=os.path.dirname(ifname)
if indir=='':
indir=os.path.abspath(os.path.curdir)
inbase,inext=os.path.splitext(os.path.basename(ifname))
return (indir,inbase,inext.lower())



def execute(ifname,ofname,workdir,args):
indir,inbase,inext=get_fnames(ifname)
if ofname==None:
ofname="%s/%s.svg" % (indir,inbase)
workfile="%s/%s.bmp" % (workdir,inbase)


if os.path.exists(ifname):
subprocess.check_call(['convert',ifname,workfile])

if inext == '.tif':
wbase=os.path.basename(workfile)
wbase,wext=os.path.splitext(wbase)
lst=glob.glob("%s/%s-*.bmp" % (workdir,wbase))
if len(lst)>0:
#print lst
idx=0
for cf in lst:
ofname='%s/%s-%d.svg' % (indir,inbase,idx)
process_potrace(args,cf,ofname)
idx+=1
else:
process_potrace(args,workfile,ofname)

else:
process_potrace(args,workfile,ofname)

else:
print("ERROR:file %s does not exist." % ifname)



if __name__ == '__main__':


import getopt,sys
ofname=None
try:
shortcmd="hk:o:w:z:t:a:O:u:n:i:"
longcmd=["help",
"output=",
"input=",
"workdir=",
"blacklevel=",
"turnpolicy=",
"turdsize=",
"alphamax=",
"opttolerance=",
"unit=",
"longcurve="]
opts,args=getopt.getopt(sys.argv[1:],shortcmd,longcmd)
if len(opts)==0 and len(args)>1:
firstarg=args[0]
opts,args=getopt.getopt(sys.argv[2:],shortcmd,longcmd)
args.append(firstarg)

if len(args) > 0:
try:
ifname=args[0]
ofname=args[1]
except IndexError:
pass

except getopt.GetoptError,e:
# something getopterror happen
print(str(e))
sys.exit(1)
except IndexError:
# no argument assigned
pass

a=ArgumentGenerator()
workdir='/tmp'
#B_LEVEL=0.9
a.add('--blacklevel',0.9)

for cmd,cmdarg in opts:

if cmd=='-h' or cmd=='--help':
print(open(sys.argv[0],'r').read())
sys.exit(0)
else:
try:
a.add(cmd,cmdarg)
except KeyError:
if cmd=='-o' or cmd=='--output':
ofname=cmdarg
elif cmd=='-i' or cmd=='--infile':
ifname=cmdarg
elif cmd=='-w' or cmd=='--workdir':
workdir=cmdarg



execute(ifname,ofname,workdir,a)





まぁなんだかメッチャクチャなコードですが…ハックということでw

使い方は、

./mypotrace.py hoge.TIF

のようにすると/tmpを使ってbmp変換→svg変換してhoge.svgが生成されるというものです。hoge.TIF内に数枚の画像が入っている場合は、hoge-0.svg,hoge-1.svg,hoge-2.svg …というように出力されます。
ImageMagickとpotraceが必要です。

2013/10/13 11:23
引数指定時に入力ファイル名に--input=を指定せずダイレクトにファイル名を書いた場合、対応できるよう修正しました。
スポンサーサイト

コメント



名前
メールアドレス
URL
パスワード

トラックバック


トラックバックURL :

モブ沢ドト彦(dothiko)

ブログ主:モブ沢ドト彦(dothiko)
@dothiko

当ブログについて (←いわゆる「最初にお読みください」というヤツです)

このfc2ブログをお絵かき専用ブログに再編するにあたり、ハンドル名ではなくペンネーム「モブ沢ドト彦」を名乗ることに致しました。今後はプログレッシブに生きていこうと思います。基本的にお絵かきは毎週土曜日更新(予定)、その他のネタは不定期という事にしています。
amazonアソシエイトに参加することにしました。
年齢は特に明示しませんが
* おっさんです *

08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

ユーザータグ

FC2Ad