rcairoの背景ぼかしにRMagickを使う。

convertも色々できるみたいだ。
もう少し、探ってみようと思いRMagickをインストールした。
sudo apt-get install librmagick-ruby

ruby/sdlで動かしたら、一瞬画面は表示したが
[BUG] Segmentation fault
ruby 1.8.7 (2010-08-16 patchlevel 302) [i686-linux]
Aborted
が、出て落ちた。
ネットで調べたけど、わからない。
だけどcairoとRMagickの組み合わせは使える。
こんな感じだ。

#!usr/bin/env ruby

require 'cairo'
require 'RMagick'

class BackGround
def initialize(w, h)
@w, @h = w, h
end

def draw(cr)
cr.set_source_color(:white)
cr.rectangle(0, 0, @w, @h)
cr.fill
end
end

class Text
def initialize(w, h)
@text = "Cairo"
@x, @y = w / 2, h / 2
@font_size = 100
@image = Cairo::ImageSurface.new(w, h)
@cr = Cairo::Context.new(@image)
@cr.font_size = @font_size
@ext = @cr.text_extents(@text)
end

def draw(cr)
cr.matrix = Cairo::Matrix.translate(@x, @y)
cr.set_source(@image, -@ext.width / 2, -@ext.height / 2)
cr.paint
end
end

class Body < Text
def initialize(w, h)
super
@cr.set_source_color(:red)
@cr.move_to(-@ext.x_bearing, -@ext.y_bearing)
@cr.show_text(@text)
end
end

class Blur < Text
def initialize(w, h)
super
@cr.set_source_color(:white)
@cr.rectangle(0, 0, w, h)
@cr.fill
@cr.set_source_color(:black)
@cr.move_to(-@ext.x_bearing, -@ext.y_bearing)
@cr.show_text(@text)
@x += 5
@y += 5
magick = Magick::Image.new(@image.width, @image.height)
magick.import_pixels(0,0, @image.width, @image.height, 'BGRA', @image.data)
magick = magick.blur_image(radius = 3, sigma = 3)
pixels = magick.export_pixels_to_str(0, 0, magick.columns, magick.rows, 'BGRA')
@image = Cairo::ImageSurface.new(pixels, 0, magick.columns, magick.rows, pixels.size / magick.rows)
end
end

w, h = 300, 200
cairo = Cairo::ImageSurface.new(w, h)
items = []
items << BackGround.new(w, h)
items << Blur.new(w, h)
items << Body.new(w, h)
cr = Cairo::Context.new(cairo)
items.each {|obj| obj.draw(cr)}
cairo.write_to_png('/tmp/blur_image')
`display /tmp/blur_image`
[PR]
by gaziya | 2011-05-23 23:09