こんにちは、伊達です。

ついでに幾つか質問があります。
1. 任意のストリームから読み書きする方法は?
2. read / write 時に直に String 配列をやりとりするのを止めたい

1. 現状では読み書きは file だけ可能となってます。
   しかし、CGI で使う場合には on the fly で画像生成ができなくてはなりませ
ん。
  任意のストリームから読み書きできるようにするにはどうしたらいいのでしょうか
?
  今、PNGのオブジェクトは

typedef struct _png_object {
  FILE *fp;
  png_structp obj;
  png_infop info;
  png_infop end_info;
} png_object;

  のようになっていますが、これを

typedef struct _png_object {
  VALUE stream;
  png_structp obj;
  png_infop info;
  png_infop end_info;
} png_object;

  などとして stream に IO (のサブクラス)のオブジェクトを保持し、
  rb_funcall で read / write するなどという安易な方法で大丈夫ですか?


2. インタレースで画像を表示するなどという場合に現状では、

  image = rpng.get_image_container
  pass = rpng.set_interlace_handling
  number_of_rows = 10
  for i in 0...pass
    0.step(image.size, number_of_rows) do |row|
      rpng.read_rows(nil, image[row, number_of_rows])
    end
  end

  のような方式をとってます。
  #get_image_container で 画像の height * width 分の空の領域(String の配
列)
  を取得し、後はそれを7パスかけて埋めていきます。
 ですが、直に String の配列をやりとりするのはどうも気に入りません。
  何か OO 的なやり方というのはありませんか?
  単にクラスにして隠蔽するしかないのかな。。。

参考:PNG のインタレース方式
http://developer.intel.com/software/idap/resources/technical_collateral/pent
iumii/916/916.htm

| DATE Ken
| Software Engineering Lab. Meiji Univ.