見つけた。

ruby/ioに標準入力を入れる方法が、やっと判ったよ。

IO.popen("convert - -rotate 45 -" ,"r+") do |io|
io.write(@data)
io.close_write
@image = Cairo::ImageSurface.from_png(io)
end

io.close_write で、入力のパイプを閉じる事が必要だったみたい。
でも、新たなる課題が、
SDL::Surface.load_bmp_from_io(io)
を使えば rcairo を通さずに直接 ruby/sdl に送れると思ったが、エラーがでる。
あと、回転させたイメージの余白が透明にならない。
でも、これで、出来る事の幅が広がった。

convertのオプションは、ここ
http://www5a.biglobe.ne.jp/~nkgwtty/njaLinuxImageMagick.html
他にも色々画像処理できそうだ。

#!usr/bin/env ruby

require 'rubygems'
require 'sdl'
require 'cairo'

class Cell
def initialize(screen)
@screen = screen
url = "http://cairographics.org/cairo-banner.png"
IO.popen("wget -q -O - #{url} | convert - -resize 50% -"){|io| @data = io.read}
@x,@y,@r = 15,15,0
end

def update
@r += 3
@r = 0 if @r > 359
IO.popen("convert - -rotate #{@r} -" ,"r+") do |io|
io.write(@data)
io.close_write
@image = Cairo::ImageSurface.from_png(io)
end
stride = Cairo::Format.stride_for_width(C_FORMAT,@image.width)
@surface = SDL::Surface.new_from(@image.data,@image.width,@image.height,32,stride,R,G,B,A)
@screen.put(@surface,@x,@y)
end
end

class Phase
def initialize(screen)
@screen = screen
@item = Cell.new(@screen)
end

def update
@screen.fill_rect(0,0,@screen.w,@screen.h,[200,200,200])
@item.update
end

def handling(event)
exit if event.kind_of?(SDL::Event::Quit) || (event.kind_of?(SDL::Event::KeyDown) && event.sym == SDL::Key::ESCAPE)
end

def run
loop do
while e=SDL::Event.poll
handling(e)
end
update
@screen.flip
SDL.delay(50)
end
end
end

C_FORMAT = Cairo::FORMAT_ARGB32
R,G,B,A = 0x00FF0000,0x0000FF00,0x000000FF,0xFF000000
SDL.init(SDL::INIT_EVERYTHING)
SDL::WM.set_caption("Rotate","")
screen = SDL::setVideoMode(230,230,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2011-02-11 10:23