2013/12/26(木) [n年前の日記]
#2 [dxruby][ruby] Rubyスクリプトの中に画像を仕込むソレ
昨日、「Rubyスクリプトの中に画像を入れておくことってできないのかな?」と疑問を持ったのだけど。どうやら簡単に(?)できるらしいと分かったのでメモ。
テキストの中にバイナリデータを入れておく方法としては、一般的には base64なるものが使えるらしくて。ソレを使って実験。ちなみに、画像の表示には DXRuby を使っております。
_imgdisp.rb
画像はコレ。Public Domain ってことで。
player.png
画像ファイルからbase64への変換は、以下のスクリプトを使ったり。なんだかワンライナーでもイケそうだけど。
_imgconv.rb
実行すると、こうなる。
この文字列を、前述のスクリプト imgdisp.rb の __END__ 以降に貼り付けてもいいし。
あるいは、imgdisp.rb の __END__ 以降を事前に削除してから、以下を実行して imgdisp.rb のお尻に追加しちゃってもいいし。
ちなみに、WindowsのDOS窓(cmd.exe)上で、Ruby スクリプトを使ってリダイレクト?( > とか >> ってやつ) を使う場合は、hoge.rb を実行したのではダメで、ruby hoge.rb を実行しないといけないようで。そのへんちょっとハマったりして。
何にせよ、base64 てのを使えば、テキストだけで書かれてるように見えてもバイナリを含めることができると知り、勉強になりました…。や、「今頃そんなこと知ったのかよ」と笑われたり呆れられたりしそうではありますが。
テキストの中にバイナリデータを入れておく方法としては、一般的には base64なるものが使えるらしくて。ソレを使って実験。ちなみに、画像の表示には DXRuby を使っております。
_imgdisp.rb
# base64をバイナリに変換してImage作成、かつ表示
require 'dxruby'
# ファイル最後のbase64文字列を読み込む
base64_text = ""
DATA.each {|l| base64_text += l.chomp}
# base64 からバイナリ化
bin_data = base64_text.unpack('m')[0]
# Image生成
img = Image.loadFromFileInMemory(bin_data).sliceTiles(2, 1)
Window.minFilter = Window.magFilter = TEXF_POINT # 拡大縮小の補間方法を「無し」に設定
Window.bgcolor = [0, 140, 255] # 背景色設定
Window.resize(320, 240) # ウインドウサイズ変更
cnt = 0
Window.loop do
break if Input.keyPush?(K_ESCAPE)
i = (cnt >> 3) & 0x01
Window.drawScale(64, 64, img[i], 3, 3) # 拡大して描画
cnt += 1
end
__END__
iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAKlBMVEVzAAD/
////ra1CISH/rXO9vb2MUhD/3q2t75xCzhAQ70IA/1IAjP8AAAAa/EhrAAAA
DXRSTlP///////////////8APegihgAAAWhJREFUOE+FkrFqwzAQQDUEumTR
kK1Lpq4B/4IglGYJQVvmTJ2K4ZYs3Tx0T+X0A0qzFlqqDIU0Q0B7fqenOyk+
ecmBBXf3nnyWpcKVUHFprwCnbVMWpcCAb5qXrlYIEXBb770gCoGAHQLfHVEI
BHhfEIWAwKn1iWg0A1IQgG+0vg19QQDPugRYQMDRO2Nbj5ahLxDQfrzrS78n
EOBiNrJ2yTMWAgGxbxdKDRMgBQReKZsMjFIJyEI0VDjOKTNTMLyFEFQE7Jwy
OMM5REAIQywgYG1V10DALwJSIOBoFxPscyECQuAhw2FyA093yBDQExhQU4AM
9AT6skoNDMbDPgNCoCuHZ8fHn7aQAl2YDcTT196vqd8JsKbf7aCO2dj7LwI2
kIV6loD7HRuftAGAScKeL4wztKWmAubGuCRkwNEVGPuftzSCEGjIS+QZhUDn
8GfyQlEIBBxWj2lJYWb8dMAqLSkqhCsW/gGJgHQo0efUBgAAAABJRU5ErkJg
gg==

- バイナリは、pngファイル。
- スクリプトの見通しをよくするために、base64文字列は、スクリプトの __END__ 以降に書いた。Ruby は、__END__ 以降の文字列を、DATA を使って読み取れるらしい。(ただし、他のスクリプトから呼ばれた場合は、そっちのスクリプトの __END__ 以下が参照されてしまうので注意。)
- Image.loadFromFileInMemory(バイナリデータ) を使えば、バイナリデータから DXRuby の Image にできる。
画像はコレ。Public Domain ってことで。
player.png
画像ファイルからbase64への変換は、以下のスクリプトを使ったり。なんだかワンライナーでもイケそうだけど。
_imgconv.rb
# 画像ファイルを読み込んで、base64にして出力する
fn = ARGV[0]
bin_data = File.binread(fn)
base64_text = [bin_data].pack('m')
puts base64_text
実行すると、こうなる。
> ruby imgconv.rb player.png iVBORw0KGgoAAAANSUhEUgAAAEAAAAAgBAMAAABQs2O3AAAAKlBMVEVzAAD/ ////ra1CISH/rXO9vb2MUhD/3q2t75xCzhAQ70IA/1IAjP8AAAAa/EhrAAAA DXRSTlP///////////////8APegihgAAAWhJREFUOE+FkrFqwzAQQDUEumTR kK1Lpq4B/4IglGYJQVvmTJ2K4ZYs3Tx0T+X0A0qzFlqqDIU0Q0B7fqenOyk+ ecmBBXf3nnyWpcKVUHFprwCnbVMWpcCAb5qXrlYIEXBb770gCoGAHQLfHVEI BHhfEIWAwKn1iWg0A1IQgG+0vg19QQDPugRYQMDRO2Nbj5ahLxDQfrzrS78n EOBiNrJ2yTMWAgGxbxdKDRMgBQReKZsMjFIJyEI0VDjOKTNTMLyFEFQE7Jwy OMM5REAIQywgYG1V10DALwJSIOBoFxPscyECQuAhw2FyA093yBDQExhQU4AM 9AT6skoNDMbDPgNCoCuHZ8fHn7aQAl2YDcTT196vqd8JsKbf7aCO2dj7LwI2 kIV6loD7HRuftAGAScKeL4wztKWmAubGuCRkwNEVGPuftzSCEGjIS+QZhUDn 8GfyQlEIBBxWj2lJYWb8dMAqLSkqhCsW/gGJgHQo0efUBgAAAABJRU5ErkJg gg==
この文字列を、前述のスクリプト imgdisp.rb の __END__ 以降に貼り付けてもいいし。
あるいは、imgdisp.rb の __END__ 以降を事前に削除してから、以下を実行して imgdisp.rb のお尻に追加しちゃってもいいし。
ruby imgconv.rb player.png >> imgdisp.rb
ちなみに、WindowsのDOS窓(cmd.exe)上で、Ruby スクリプトを使ってリダイレクト?( > とか >> ってやつ) を使う場合は、hoge.rb を実行したのではダメで、ruby hoge.rb を実行しないといけないようで。そのへんちょっとハマったりして。
何にせよ、base64 てのを使えば、テキストだけで書かれてるように見えてもバイナリを含めることができると知り、勉強になりました…。や、「今頃そんなこと知ったのかよ」と笑われたり呆れられたりしそうではありますが。
◎ こういう使い方って意味あるのかな。 :
ソースにバイナリを仕込めたものの。サンプルソースの中に、こんな謎文字列が並んでたら、ソレってどうなのという気もしたり。
もしかして DXRuby などは、実験用に使えるメソッドとかあったら便利なのだろうか。
まあ、そのへんは、enchant.js に任せるべきなのかな…。あっちのクマさん画像は、子供達に訴求力ありそう。
Scratch も、その手の画像があらかじめ入ってるけど。あの絵柄で喜ぶのはアメリカンな子供達だけだろうな…。
もしかして DXRuby などは、実験用に使えるメソッドとかあったら便利なのだろうか。
k_img = Image.makeBear() # テスト用のクマさん画像を作成 m_img = Image.makeMiku() # テスト用の初音ミク画像を作成みたいな。学習用ライブラリとして強化するなら、そういうのも有効かもしれない?
まあ、そのへんは、enchant.js に任せるべきなのかな…。あっちのクマさん画像は、子供達に訴求力ありそう。
Scratch も、その手の画像があらかじめ入ってるけど。あの絵柄で喜ぶのはアメリカンな子供達だけだろうな…。
◎ 参考になった記事をメモ。 :
[ ツッコむ ]
以上です。