mieki256's diary



2015/01/01(木) [n年前の日記]

#2 [prog][nitijyou][cg_tools] 年賀状を書くためにPythonスクリプトを書いたり

年賀状に貼る画像を作成すべく、素材画像を作成後、Python + _Pillow (PIL) で、ドット単位で加工をするスクリプトを書いてみたり。年賀状を書くためにPythonスクリプトを書く! みたいな。

環境は、Windows7 x64 + Python 2.7.8 + Pillow 2.6.1。

_conv_img.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- mode: python;Encoding: utf8n -*-

'''
1ドットずつ加工した画像を生成するPythonスクリプト

usage: conv_img.py INPUT_IMAGE OUTPUT_IMAGE
'''

import sys
from PIL import Image

SCALEX, SCALEY = 8, 8

def get_color(c, v):
    ''' 色を与えられた係数で明るくしたり暗くしたり '''
    
    r, g, b = c
    return (int(r * v), int(g * v), int(b * v))

def write_img(im, sx, sy, cc):
    ''' 1ドット分の色を数倍にして描き込む '''
    
    nx = sx * SCALEX
    ny = sy * SCALEY
    r, g, b = cc
    
    for y in range(SCALEY):
        for x in range(SCALEX):
            im.putpixel((nx + x, ny + y), (r, g, b))
            
    for x in range(SCALEX):
        x0 = nx + x
        y0 = ny
        im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 1.3))
        # y0 = ny + 1
        # im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 1.2))
        # y0 = ny + SCALEY - 2
        # im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 0.7))
        y0 = ny + SCALEY - 1
        im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 0.7))
        
    for y in range(SCALEY):
        x0 = nx
        y0 = ny + y
        im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 1.2))
        # x0 = nx + 1
        # im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 1.1))
        # x0 = nx + SCALEX - 2
        # im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 0.8))
        x0 = nx + SCALEX - 1
        im.putpixel((x0, y0), get_color(im.getpixel((x0, y0)), 0.8))
        
def conv_img(infile, outfile):
    im = Image.open(infile, 'r')
    srcim = im.convert("RGB")
    w, h = im.size
    nim = Image.new("RGB", (w * SCALEX, h * SCALEY))
    for y in range(h):
        for x in range(w):
            write_img(nim, x, y, srcim.getpixel((x, y)))
    nim.save(outfile, 'PNG')
    nim.show()
    
def main():
    argvs = sys.argv
    if len(argvs) != 3:
        print "usage: python conv_img.py INPUT_IMAGE OUTPUT_IMAGE"
        sys.exit()
    
    infile = argvs[1]
    outfile = argvs[2]
    conv_img(infile, outfile)

if __name__ == '__main__':
    main()

python conv_img.py hoge.png hoge_out.png
と打てば、以下のような感じの変換が。
test01_setsumei.png

こういう処理が簡単に書けるから、Python + Pillow (PIL) は個人的に好きです。お手軽・気楽に使えると言うか。

しかし、考えてみたら、この程度ならGIMPでもできるよなあ…。例えば…。
  1. 元画像をn倍に、補間なしで拡大
  2. n x n ドットでグレースケールの画像を作る
  3. フィルタ → マップ → 並べる、で敷き詰める
  4. レイヤーで重ねてレイヤーモードを変更

GIMPで試してみたり。

test01_cv_gimp.png

うむ。Python スクリプトを書く必要は無かった…ですね…。

以上です。

過去ログ表示

Prev - 2015/01 - Next
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 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project