From: "Iñaki Baz Castillo" Date: 2009-12-03T18:43:52+09:00 Subject: Re: Encoding/decoding a image as Base64 (fails under Ruby1.9 but works under Ruby1.8) El Jueves, 3 de Diciembre de 2009, Robert Klemme escribió: > 2009/12/3 Iñaki Baz Castillo : > > Hi, the folowing code encodes and decodes a image file as Base64: > > > > - Encode "icon.png" in Base64 as "base64.txt": > > -------------------------------------- > > File.open("base64.txt","w") do |file| > > file.write [open("icon.png").read].pack("m") > > end > > -------------------------------------- > > > > - Decode "base64.txt" as a PNG "new_icon.png" file: > > -------------------------------------- > > File.open('new_icon.png', 'wb') do |file| > > file << (IO.readlines('base64.txt').to_s.unpack('m')).first > > end > > -------------------------------------- > > > > > > It works perfectly under Ruby1.8 (after encoding and decoding "icon.png" > > is exatcly the same as "new_icon.png", the same binay file). > > > > However running under Ruby1.9 the result is different since > > "new_icon.png" is a corrupted image file. When I try to open it with a > > image viewer I get this error (under Linux): > > > > libpng warning: gAMA: CRC error > > libpng error: PNG unsigned integer out of range. > > > > > > Which is the difference when using Ruby1.9? how to solve it? > > Thanks a lot. > > One thing strikes odd: you are not reading the file in binary mode. > It may be that 1.9 punishes you for that. You probably rather want > > File.open("base64.txt","w") do |file| > file.write [File.open("icon.png", "rb") {|io| io.read}].pack("m") > end > > You can simplify decoding as > > File.open('new_icon.png', 'wb') do |file| > file.write(File.read('base64.txt').unpack('m').first) > end That makes lot of sense! Thanks. -- Iñaki Baz Castillo