目次

画像データ生成(Python)

 必要に迫られ、テストパターンとする画像を
 作ることがありました。



 階調のついた画像データを作るために、PNMの
 ファイルフォーマットを確認します。

 PNM (Portable aNyMap 形式、Netpbm形式) は、3種類の
 画像フォーマットをまとめて呼ぶときに使われます。
 PBM(portable bitmap format)、PGM(portable graymap format)
 PPM(portable pixmap format)があり、順番にモノクロ単色、
 階調つき白黒、カラーと扱う色数が多くなります。


 PBM形式の画像は、単純なアイコンに利用し
 PGM形式の画像は、グラデーションが必要な
 ときに利用します。

 PNMの場合、テキストファイルに情報を入れておけば
 UNIXで使われることが多い画像変換アプリケーション
 プログラムImageMagickを利用できます。



 ImageMagickのアプリケーション一式の中に「convert」と
 いう、画像フォーマットを変換するファイルがあるので
 次のようにPBM、PGMの画像フォーマットのファイルから
 GIF形式へ変換できます。

convert filename.pbm filename.gif
convert filename.pgm filename.gif

 PBM、PGMで画像データを記述して、変換してみます。

 PGM画像データ生成
  PBMの画像データの例として、5x7のアイコンを取り上げます。
  5x7は、キャラクタLCDの文字を構成するのに利用されることが
  多いので、LCDへの表示がどうなるのかを確認するため採用します。

  テキストファイルtst.pbmの内容は、以下。

P1
# bitmap without gradation
5 7
0 0 0 0 0
0 0 0 1 0
0 0 1 1 0
0 1 1 1 0
0 1 1 1 0
0 0 1 1 0
0 0 0 0 0

  内容を見ていきます。
  ・「P1」は、マジックナンバーで、PBM形式を示す
  ・コメントは「#」を利用
  ・横のピクセル数、縦のライン数を指定
  ・ビットパターンを指定

  変換は、次のように操作します。



  画像は、次のようになります。
  (拡大表示で、わかりやすくしてます)



  ビットマップ形式は、アイコンを作成するときに利用
  することが多いので、方眼紙にパターンを作っておき
  それをテキストファイルに入れるだけです。

  Pythonのスクリプトは、テキストファイルになっている
  ビットマップを読込んで、ヘッダを付加するだけでよい
  とします。

  P1と縦横の情報を付加した新しいファイルを生成します。
  スクリプトは、次のように定義します。

# open
fin = open('gd.txt','r')
# get
line = fin.read()
# close
fin.close()

# calculate line number
xlist = line.split('\n')
last = len(xlist)
glist = xlist[:last-1]

# get parameter
x = len( glist[0].split(' ') )
y = len( glist )

# open
fout = open('gd.pbm','w')
# header
fout.write("P1\n")
# size
fout.write(str(x)+" "+str(y)+"\n")
# body
fout.write("# body\n");
fout.write(line)
# close
fout.close()

  次のように操作し、ファイルを生成します。



 PGM画像データ生成
  PGM形式では、階調が情報として必要になるので
  次のような拡張子が「pgm」のテキストファイル
  を利用します。

P2
# gradation
16 8
15
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0

  ImageMagickで変換すると、次のようになります。



  階調がついた画像を生成するスクリプトを定義しますが
  CUIでの操作を考え、テキストファイルに情報を格納して
  おきます。

gra.pgm
64 45
63

  PGMファイル名、横縦のサイズ、最大値を格納します。
  ここまで仕様を決めると、次のスクリプトでよいでしょう。

# open
fin = open('gdat.txt','r')
# get
line = fin.read()
# close
fin.close()

# generate list
glist = line.split('\n')

# get parameters
fname  = glist[0]
wh = glist[1].split(' ')
width  = int(wh[0])
height = int(wh[1])
xmax   = int(glist[2])

# open
fout = open(fname,'w')
# graphic file format
fout.write("P2\n")
# size
fout.write(glist[1]+"\n")
# maximum
fout.write(glist[2]+"\n")
# generate code
for y in range(0,height) :
  stmp = "" 
  for x in range(0,width) :
    stmp += "{0:3d}".format(x) + ' '
  fout.write( stmp + '\n' )
# close
fout.close()

  実際の操作は、以下です。



  生成した画像データは、次のようになります。




目次

inserted by FC2 system