File.openとFile.writeを使った画像のコピー(読み込み&書き込み)

what

File.openとFile.writeを使ったコピーで、テキストファイルはうまくいくが、画像ファイルがうまくいかないので、うまくいくようにする。

以下のファイルがあります
C:\enjoy_ruby\file\file.rb ※rubyファイル
C:\enjoy_ruby\file\original.jpg ※適当な画像ファイル 21KB
Rubyファイル
original = File.open("original.jpg", "r") # 読み込みモード
copy     = File.open("copy.jpg", "w") # 新規作成書き込みモード
copy.write(original.read)
original.close
copy.close

上記を実行すると、エラーは出ません。
結果は、copy.jpg はできるのですが、1KBしかなく画像になっていません。

ためしに、画像ファイルではなく、テキストファイルでやってみたらちゃんとコピーされました。
画像の場合は何が違うのでしょうか。

バイナリモードでやってみる

original = File.open("original.jpg", "r+b") # 読み込みモード
copy     = File.open("copy.jpg", "w+b") # 新規作成書き込みモード
copy.write(original.read)
original.close
copy.close

あっさり成功w
画像はバイナリファイルなので、バイナリモードでやらないとってことですね。

ちなみに

copy.jpg 側だけを通常モードでオープンすると、ファイルサイズは同じくらいになりますが、画像として成立しません。

original = File.open("original.jpg", "r+b") # 読み込みモード
copy     = File.open("copy.jpg", "w") # 新規作成書き込みモード
copy.write(original.read)
original.close
copy.close
オリジナル画像


コピーした画像

※ちなみに、 copy.jpg のままではエラーがおきて、はてなフォトライフにはアップできませんでした。画像ファイルとしてはバイナリが壊れているようですね。上記の写真はローカルマシンでプレビューしたイメージをPrint Screenで切り取ったものです。