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")