Last active
August 29, 2015 14:01
-
-
Save shimada-k/fccfb6fb8b6f8764aadc to your computer and use it in GitHub Desktop.
imlibのdraw_textを使っていい感じに画像に文字列を書くプログラム
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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