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で切り取ったものです。