DXRubyでPNG出力

DirectX9ではPNG入力はできるが出力ができない。出力フォーマットとして指定してもまともに出てくれない。
DXRuby1.0系では諦めていたが、ZLibを使えばRubyレベルで簡単に出力することはできるようだ。
参考はまめめもさまとKEEP OUT 原始力研究所さま。
http://d.hatena.ne.jp/ku-ma-me/20091003/p1
http://keeeeeeep.blog72.fc2.com/blog-entry-12.html


DXRubyでこれをやるにはこのようなコードとなる。ZLibが必要で、ActiveScriptRubyを使っているなら入っている。いずれ標準で対応したいところだ。

require 'dxruby'
require 'zlib'

class Image
  def save_png(file_name)
    image_data = []
    for y in 0...height
      image_data.push(0)
      for x in 0...width
        temp = self[x,y]
        temp.push(temp.shift) # ARGB→RGBA
        image_data.concat(temp)
      end
    end
    def chunk(type, data)
      [data.size, type, data, Zlib.crc32(type + data)].pack("NA4A*N")
    end
    open(file_name,"wb") do |fh|
      fh.write("\x89PNG\r\n\x1a\n")
      fh.write(chunk("IHDR", [width, height, 8, 6, 0, 0, 0].pack("NNCCCCC")))
      fh.write(chunk("IDAT", Zlib::Deflate.deflate(image_data.pack("C*"))))
      fh.write(chunk("IEND", ""))
    end
    return self
  end
end

image = Image.new(100,100,[255,255,0])
image.save_png("c:\\dat.png")