フォントの縁取り
twitterでフォントの縁取りがしたいという話が出た。
俺は画像処理は得意ではないのだが、やりたいことができないのは寂しいことなので、ちょっといじってみた。
白背景に白いフォントを黒い縁取りで描いてみた画像。
縁取りの幅がアンチエイリアス込み1ピクセルなのであまり綺麗にならなかった。
ところでフォントのImage描画をするImage#drawFontなのだが、DXRuby1.0.5ではアンチエイリアスの色計算式にバグがあって、厳密には綺麗に描画できていない。
なんとなく出てるからOKかなーって思ってたけど、縁取りのために画像のデータを検証してたら思った通りに出ていなかった。
微妙なところだが。
ソースを上げてはおくが、これはそのバグを修正したバージョンDXRuby1.0.6予定でしか動かないので、今はまだ使えない。
ためしてみたい人はSourceForgeのSVNのtrunkに1.8用だけ置いてあるので、取ってくるとよい。
Window.drawTileのバグ修正と、SegmentationFault問題の対策も入っている。
追加のバグも入っているかもしれないが。
require 'dxruby' font = Font.new(128) image = Image.new(200,200).drawFont(0,0,"あ",font) # image使ってないけど。 image2 = Image.new(200,200).copyRect(0, 0, image) # image2にコピー Window.bgcolor = [255,255,255] Window.width = 320 Window.height = 240 for y in 1..198 for x in 1..198 if image2[x, y][0] == 255 temp1 = image2[x-1, y][0] temp2 = image2[x+1, y][0] temp3 = image2[x, y-1][0] temp4 = image2[x, y+1][0] image2[x-1, y] = [temp1, 0, 0, 0] if temp1 != 255 image2[x+1, y] = [temp2, 0, 0, 0] if temp2 != 255 image2[x, y-1] = [temp3, 0, 0, 0] if temp3 != 255 image2[x, y+1] = [temp4, 0, 0, 0] if temp4 != 255 temp_color = (temp1+temp2+temp3+temp4) / 4 image2[x,y] = [255, temp_color, temp_color, temp_color] end end end Window.loop do Window.draw(0,0,image2) end
アンチエイリアシング処理がされている画像をいじるのは難しい。
どういうフィルタがかかっているかが確定できれば、それなりにやりようはあるのだが。
WindowsのdrawTextは見たところ普通に線形補間ぽいので、それっぽい処理にしてある。