MY-NOTEBOOK

Wednesday, August 27, 2008

JythonとJava2Dを使って、すばやくイメージ素材を作成(ただしプログラマ向け)

デスクトップ向けのアプリケーションの仕事で最後の仕上げに、ツールバーのアイコンやプログラムの起動アイコンなどを作成しなければなりません。
アイコンデータをデザイナーさんに頼めると楽なのですが、そうではない場合、プログラマが作成します。(わたしの場合)
普通はイラストレータなどを使ってつくると思いますが、マウスでちまちまやるのがわたしは苦手です。
そこで、Java2Dを使って、イメージデータもJavaでつくるという手がありますが、はっきりいってイメージデータのためだけにJavaでコーディングするのは面倒すぎです。
そこで、Java2Dは使いたい、しかし手間はかけたくない、ということで、jythonとJava2D の組合わせでイメージデータを生成してみましたので、そのコードをメモしておきます。

生成するイメージデータ

イメージを生成するjythonコード

import sys

import java.lang as lang
import java.io as io
import java.awt as awt
import java.awt.image as awtimage
import javax.imageio as imageio


mysize=awt.Dimension(100,100)

def createImage(size):
	type=awtimage.BufferedImage.TYPE_4BYTE_ABGR
	bimg=awtimage.BufferedImage(size.width,size.height,type)
	return bimg

def paint(g):

	g.setColor(awt.Color.WHITE)
	g.fill(awt.Rectangle(mysize.width,mysize.height))

	g.setColor(awt.Color.BLACK)
	g.draw(awt.Rectangle(mysize.width-1,mysize.height-1))

	msg="Hello World."
	w=g.getFontMetrics().stringWidth(msg)
	h=g.getFontMetrics().getHeight()

	x=(mysize.width-w)/2
	y=(mysize.height-h)/2
	g.drawString(msg,x,y)



outf=None

try:
	outf=sys.argv[1]
except :
	print "Usage: jython image.py outputfile.png"

if outf==None:
	sys.exit()

bimg=createImage(mysize)
g=bimg.getGraphics()
g.setRenderingHint(awt.RenderingHints.KEY_ANTIALIASING,awt.RenderingHints.VALUE_ANTIALIAS_ON)
paint(g)
g.dispose()

fos=io.FileOutputStream( outf )
imageio.ImageIO.write(bimg,"PNG",fos)
fos.close()


生成方法

$ jython image.py test.png

ポイントは、paint関数

一度 image.py を書いてしまえば、あとはグラフィック描画部分のコードだけを
書き換えてやることで、なんどでも使い回すことができます。

    def paint(g) :
            g.setColor(awt.Color.WHITE)
            g.fill(awt.Rectangle(mysize.width,mysize.height))
    
            g.setColor(awt.Color.BLACK)
            g.draw(awt.Rectangle(mysize.width-1,mysize.height-1))
    
            msg="Hello World."
            w=g.getFontMetrics().stringWidth(msg)
            h=g.getFontMetrics().getHeight()
    
            x=(mysize.width-w)/2
            y=(mysize.height-h)/2
            g.drawString(msg,x,y)
© 2006-2012 Tomoaki Oshima