PythonでETC用にマスク画像を作るツール

以前の記事で紹介したマスクを作るツールをpythonで実装しました。

##開発環境
Python 2.7.9
Python Imaging Library 1.1.7

##概要
画像ファイルを入れるとマスク画像を出力する
CreateMask.py [マスク元のファイル]

##オプション
[-w] 横にマスクを持つ画像を生成
[-h] 縦にマスクを持つ画像を生成
[-o] [出力ファイル] 指定されたファイル名で出力(この指定がない場合は、入力ファイル名に_mをつけて出力)


```csharp:CreateMask.py

# -*- coding: utf-8 -*-

if __name__ == "__main__":
  import sys
  import os
  import Image

  # ------------------------------------------------------------------------------------------------------
  # 通常のマスク画像生成
  # ------------------------------------------------------------------------------------------------------
  def CreateMaskNormal(src, dst) :
    srcdata = list(src.getdata())    # 元のデータを取得
    for i in range(len(data)) :
      c = data[i][3]
      data[i] = (c, c, c)
    dst.putdata(data)


  # ------------------------------------------------------------------------------------------------------
  # 横にマスクがある画像生成
  # ------------------------------------------------------------------------------------------------------
  def CreateMaskWidth(src, dst, width, height) :
    srcdata = list(src.getdata())    # 元のデータを取得
    dstdata = srcdata + srcdata      # 書き込み先の領域を確保

    for y in range(height) :
      soff = y * width;
      doff = y * width * 2;
      for x in range(width) :
        ct = srcdata[soff]
        c = ct[3]
        dstdata[doff] = (ct[0], ct[1], ct[2])
        dstdata[doff + width] = (c, c, c)
        soff += 1
        doff += 1
    dst.putdata(dstdata)


  # ------------------------------------------------------------------------------------------------------
  # 縦にマスクがある画像生成
  # ------------------------------------------------------------------------------------------------------
  def CreateMaskHeight(src, dst, width, height) :
    srcdata = list(src.getdata())    # 元のデータを取得
    dstdata = srcdata + srcdata      # 書き込み先の領域を確保

    hlen = len(srcdata)
    for y in range(height) :
      off = y * width;
      for x in range(width) :
        ct = srcdata[off]
        c = ct[3]
        dstdata[off] = (ct[0], ct[1], ct[2])
        dstdata[off + hlen] = (c, c, c)
        off += 1
    dst.putdata(dstdata)

  # ------------------------------------------------------------------------------------------------------
  # マスク画像の生成
  # ------------------------------------------------------------------------------------------------------
  def CreateMask(in_file, out_file, w_scale, h_scale) :
    src = Image.open(in_file)
    if src.mode != "RGBA":
      return False

    dst = Image.new("RGB", (src.size[0] * w_scale, src.size[1] * h_scale))

    if w_scale != 1 :
      CreateMaskWidth(src, dst, src.size[0], src.size[1])
    elif h_scale != 1 :
      CreateMaskHeight(src, dst, src.size[0], src.size[1])
    else :
      CreateMaskNormal(src, dst)

    dst.save(out_file, "png")

    return True

  # ------------------------------------------------------------------------------------------------------
  # メイン処理
  # ------------------------------------------------------------------------------------------------------
  args = sys.argv  # コマンドライン引数を格納したリストの取得
  argc = len(args) # 引数の個数

  w = False; # 横にマスクを作成の有無
  h = False; # 縦にマスクを作成の有無
  o = False; # 出力ファイル指定
  in_file = "";    # 入力ファイル名
  out_file = "";   # 出力ファイル名

  # 引数を確認
  for i in range(1, argc):
    if args[i] == "-w":
      w = True
    elif args[i] == "-h":
      h = True
    elif args[i] == "-o":
      o = True
      out_file = args[i + 1]
    elif o:
      o = False
      out_file = args[i]
    else:
      in_file = args[i]

  if in_file == "":
    print u"CreateMask.py     [読み込む画像ファイル名]"
    print u"-w                横にマスクを生成"
    print u"-h                縦にマスクを生成"
    print u"-o 出力ファイル名 出力ファイル名を設定"
    print u"                  設定がない場合は、入力ファイルに_mが追加されて出力"
    sys.exit()

  path = os.path.dirname(in_file)
  if path != "" :
    path += u"/"

  if out_file == "" :
    # 出力ファイル名がない場合は入力ファイルに_mを追加したものを設定
    file, ext = os.path.splitext(os.path.basename(in_file))
    out_file = path + file + u"_m.png";
  elif os.path.exists(out_file) != u".png" :
    # 拡張子に.pngを設定
    out_file = path + os.path.basename(out_file) + ".png";

  # 幅の設定
  w_scale = 1
  if w :
    w_scale = 2

  # 高さの設定
  h_scale = 1
  if h and not w:
    h_scale = 2

  # マスクを作成
  CreateMask(in_file, out_file, w_scale, h_scale);

```

##最後に
これでmacでも変換できますよ！
<b>Python Imaging Libraryをインストールしないと動かない</b>ので注意してください。