フォントの縁取り

twitterでフォントの縁取りがしたいという話が出た。
俺は画像処理は得意ではないのだが、やりたいことができないのは寂しいことなので、ちょっといじってみた。
白背景に白いフォントを黒い縁取りで描いてみた画像。

縁取りの幅がアンチエイリアス込み1ピクセルなのであまり綺麗にならなかった。
ところでフォントのImage描画をするImage#drawFontなのだが、DXRuby1.0.5ではアンチエイリアスの色計算式にバグがあって、厳密には綺麗に描画できていない。
なんとなく出てるからOKかなーって思ってたけど、縁取りのために画像のデータを検証してたら思った通りに出ていなかった。
微妙なところだが。
ソースを上げてはおくが、これはそのバグを修正したバージョンDXRuby1.0.6予定でしか動かないので、今はまだ使えない。
ためしてみたい人はSourceForgeSVNの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は見たところ普通に線形補間ぽいので、それっぽい処理にしてある。