Encoding/decoding a image as Base64 (fails under Ruby1.9 but works under Ruby1.8)

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.

El Jueves, 3 de Diciembre de 2009, Iñaki Baz C. escribió:


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.

The difference is in the second step, the decoding process, since
“base64.txt”
file is the same using Ruby1.8 or 1.9.

El Jueves, 3 de Diciembre de 2009, Iñaki Baz C. escribió:

The difference is in the second step, the decoding process, since
“base64.txt” file is the same using Ruby1.8 or 1.9.

Ok, the issue is fixed by uing “IO.read” rather than “IO.readlines”:

  • Decode “base64.txt” as a PNG “new_icon.png” file:

On Thu, Dec 3, 2009 at 1:22 AM, Iñaki Baz C. [email protected] wrote:

File.open(“base64.txt”,“w”) do |file|
file.write [open(“icon.png”).read].pack(“m”)
end

File.open(‘new_icon.png’, ‘wb’) do |file|
file << (IO.readlines(‘base64.txt’).to_s.unpack(‘m’)).first
end

Which is the difference when using Ruby1.9? how to solve it?
Thanks a lot.

In Ruby 1.9, Array#to_s is an alias for Array#inspect.

In Ruby 1.8, Array#to_s worked like Array#join with no arguments.

Try this:
IO.read “base64.txt”

2009/12/3 Iñaki Baz C. [email protected]:


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

Kind regards

robert

El Jueves, 3 de Diciembre de 2009, Robert K.
escribió:> > - Decode “base64.txt” as a PNG “new_icon.png” file:

However running under Ruby1.9 the result is different since
One thing strikes odd: you are not reading the file in binary mode.
end
That makes lot of sense!
Thanks.

El Jueves, 3 de Diciembre de 2009, Lars C.
escribió:> > Thanks a lot.

In Ruby 1.9, Array#to_s is an alias for Array#inspect.

In Ruby 1.8, Array#to_s worked like Array#join with no arguments.

Try this:
IO.read “base64.txt”

Yes. It seems that usng “to_s” could be a bit problematic under Ruby1.9
due to
the new behaviour…
Thanks.

On Thu, Dec 3, 2009 at 5:01 AM, Iñaki Baz C. [email protected] wrote:

El Jueves, 3 de Diciembre de 2009, Lars C. escribió:

On Thu, Dec 3, 2009 at 1:22 AM, Iñaki Baz C. [email protected] wrote:
In Ruby 1.9, Array#to_s is an alias for Array#inspect.

In Ruby 1.8, Array#to_s worked like Array#join with no arguments.

Yes. It seems that usng “to_s” could be a bit problematic under Ruby1.9 due to
the new behaviour…

http://talklikeaduck.denhaven2.com/2009/10/27/its-the-little-things


Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Twitter: http://twitter.com/RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale