Skip to content

Instantly share code, notes, and snippets.

@shimada-k
Last active August 29, 2015 14:01
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shimada-k/fccfb6fb8b6f8764aadc to your computer and use it in GitHub Desktop.
Save shimada-k/fccfb6fb8b6f8764aadc to your computer and use it in GitHub Desktop.
imlibのdraw_textを使っていい感じに画像に文字列を書くプログラム
require 'rubygems'
$KCODE='UTF-8'
require 'moji'
require 'imlib2'
class Convert
IMGSIZE = 240
# @write_dir:書き込み先ディレクトリ名
def initialize(write_dir)
@_dir = write_dir + '/'
end
# pt(ポイント)からpx(ピクセル)を計算する関数
def pt2px(pt)
# 36 : 27 = X : pt
return (36 * pt) / 27
end
# px(ピクセル)からpt(ポイント)を計算する関数
def px2pt(px)
# 36 : 27 = px : X
return (27 * px) / 36
end
# 文字列から適切なフォントサイズで文字列を矩形に整列させた連想配列を返すメソッド
# @str :計算する文字列(全角化処理をしてある文字列を想定)
def calcStringAndSize(str)
# 1.文字数を計算する
char_num = str.length / 3
puts 'char_num:' + char_num.to_s
# 2.文字数の平方根をとり一辺の文字数を決定する
char_side_num = Math.sqrt(char_num.to_f).ceil
puts 'char_side_num:' + char_side_num.to_s
# 3.文字列を行ごとの配列に格納する
data = Hash.new()
data['str'] = Array.new()
copy_start = 0
counter = 0
str_array = str.split(//u)
str_array.each_with_index{|char, index|
# 一行におさめるだけ納められたら
if counter == char_side_num - 1 then
push_str = String.new()
for i in copy_start..index do
push_str += str_array[i]
end
data['str'].push(push_str)
copy_start = index + 1
counter = 0
# 最後の行
elsif index == str_array.length - 1 then
push_str = String.new()
for i in copy_start..index do
push_str += str_array[i]
end
data['str'].push(push_str)
else
counter += 1
end
}
# 4.フォントサイズを計算する
# 縦と横の文字数の違いで分岐させる
if data['str'].length == char_side_num then
# 一緒だったら文字数一文字分だけのスペースを捻出するためchar_side_numに1を足したもので割る
data['size'] = px2pt(IMGSIZE) / (char_side_num + 1)
# フォントサイズからマージンを計算する
data['margin_vertical'] = (px2pt(IMGSIZE) - (data['size'] * data['str'].length)) / data['str'].length
elsif data['str'].length < char_side_num then
# 違ってたら文字サイズは変えずにマージンを計算する
data['size'] = px2pt(IMGSIZE) / char_side_num
# フォントサイズからマージンを計算する
data['margin_vertical'] = (px2pt(IMGSIZE) - (data['size'] * data['str'].length)) / data['str'].length
end
puts 'size:' + data['size'].to_s
puts 'margin_vertical:' + data['margin_vertical'].to_s
data['offset_vertical'] = 0
# フォントサイズから横方向のマージンを計算する
data['offset_horizon'] = (px2pt(IMGSIZE) - (data['size'] * char_side_num)) / 2
return data
end
# 文字列を画像に埋め込むメソッド
# @str:埋め込む文字列
# @filename:読み込み先ファイル名
def composition(str, filename = '/home/shimada-k/ws/rgb/public/images/blue.png')
img = Imlib2::Image.load(filename)
# フォントのパス追加
Imlib2::Font.add_path('/usr/share/fonts/truetype')
Imlib2::Font.add_path('/home/shimada-k/Development/fonts')
Imlib2::Font.add_path('/home/shimada-k/Development/fonts/mplus-TESTFLIGHT-058')
stringAndSize = calcStringAndSize(Moji.han_to_zen(str))
puts stringAndSize['margin_vertical'].to_s
#スラッシュの後に大きさを指定する
font = Imlib2::Font.new('ttf-japanese-gothic/' + stringAndSize['size'].to_s)
#font = Imlib2::Font.new('JiyunoTsubasa/' + stringAndSize['size'].to_s)
#font = Imlib2::Font.new('UtsukushiMincho/' + stringAndSize['size'].to_s)
#font = Imlib2::Font.new('uzura/' + stringAndSize['size'].to_s)
#font = Imlib2::Font.new('FLOPDesignFont/' + stringAndSize['size'].to_s)
#font = Imlib2::Font.new('mplus-1c-bold/' + stringAndSize['size'].to_s)
#font = Imlib2::Font.new('07LogoTypeGothic7/' + stringAndSize['size'].to_s)
color = Imlib2::Color::WHITE
stringAndSize['str'].each_with_index{|str_entry, index|
puts str_entry + '@' + index.to_s
puts pt2px((stringAndSize['margin_vertical'] + stringAndSize['size']) * index).to_s
img.draw_text(font,
str_entry,
stringAndSize['offset_horizon'],
stringAndSize['offset_vertical'] + pt2px((stringAndSize['margin_vertical'] + stringAndSize['size']) * index),
color)
}
output = @_dir + DateTime.now.strftime('%s') + '_0.png'
img.save(output)
return output
end # end of for
end # end of class
def writeImage(str, conv)
name = conv.composition(str)
puts name
sleep(1)
end
conv = Convert.new('/home/shimada-k/ws/rgb/public/images/shelter')
writeImage('理解なんてものは概ね願望に基づくものだ。', conv)
#writeImage('バトー。悪いことは言わねぇ、ドライにしろ。栄養のバランスから考えても、それが賢い選択だ。', conv)
writeImage('根拠ですって。そうささやくのよ、あたしのGHOSTが。', conv)
writeImage('我々の間には、チームプレーなどという都合のよい言い訳は存在せん。あるとすればスタンドプレーから生じるチームワークだけだ。', conv)
writeImage('私みたいに全身を義体化したサイボーグなら誰でも考えるわ。もしかしたら自分はとっくに死んじゃってて、今の自分は電脳と義体で構成された模擬人格なんじゃないかって。いえそもそも初めから私なんてものは存在しなかったんじゃないかって。', conv)
#writeImage('I thought what Id do was, Id pretend I was one of those deaf-mutes.', conv)
#writeImage('世の中に不満があるなら自分で変えろ。それが嫌なら耳と目を閉じ口をつぐんで孤独に暮せ。', conv)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment