概要
mascotboyさんのTEE PARTYの、図案や文字の組み合わせでたくさんの似たような種類のTシャツが作られているのが面白いと思いました。
これを真似して、Rubyスクリプトで図案の配置・組み合わせによる画像生成を行ってTシャツを作ることを思いつきました。画像をアップロードするだけでTシャツが販売できるSUZURIを使って作ったTシャツはこちらです。
図案
犬の顔の数が違うだけの「2」、「3」、「4」がありますが、同じようなことを2進数で表現することを思いつきました。
拙作ゲームのキャラクターを使って、目を開けていたら"1"、閉じていたら"0"ということにして、こんな感じ:
4つのロボットの顔で4ビット2進数を表現し、全16種類のTシャツを作りました。
方法
SUZURIへアップロードする素材はPNGかJPEGです。Tシャツ用画像のテンプレート(指定サイズの空画像)が用意されているので、そのサイズに収まる画像を作ってアップロードすればよいわけです。
このテンプレート画像にロボットの顔の画像を適宜配置していきます。画像合成にはImageMagickを使いました。画像を拡大したり、指定した位置に貼り付けたりできます。ループ処理とかビットの立っている桁を調べたりとかを、すべてシェルスクリプトでまかなうのには限界を感じたので、RubyでImageMagickを扱えるRMagickを利用しました。
スクリプトは以下です。(Gist)
require 'rubygems'
require 'rmagick'
# サイズなど定数
ICON_W = 32
ICON_H = 32
SCALE = 18
Y = 32 * SCALE
GAP = (2520 - ICON_W * SCALE * 4) / 3
W = ICON_W * SCALE
H = ICON_H * SCALE
# base_imageにobj_imageをi個ずれた位置に置く
def stamp(base_image, obj_image, i)
return base_image.composite(obj_image, Magick::NorthWestGravity, i * (W + GAP), Y, Magick::OverCompositeOp)
end
# 顔画像読み込み、拡大
robot0 = Magick::Image.read('./robot0.png').first
robot1 = Magick::Image.read('./robot1.png').first
robot0.scale!(SCALE)
robot1.scale!(SCALE)
# テンプレート画像読み込み
base = Magick::Image.read('./suzuri-template-tshirts.png').first
# 0〜15まで作る
16.times do |i|
image = base
# 4桁分顔を置く
4.times do |j|
image = stamp(image, ((i & (8 >> j)) == 0) ? robot0 : robot1, j)
end
image.write('./out' + i.to_s + '.png')
end
おわりに
16枚の画像生成は自動化出来ましたが、SUZURIへの画像アップロードから販売開始までは手作業になるので面倒でした。Web APIがあったらいいな、と思いましたが、自動生成ゴミTシャツでサイトが埋め尽くされたりしそうですね。
今回は簡単な画像の配置の組み合わせをしただけですが、Adobeツールを使わないでできました。もっと複雑なこともできそうですね。
以上です。