mieki256's diary



2013/12/26(木) [n年前の日記]

#2 [dxruby][ruby] Rubyスクリプトの中に画像を仕込むソレ

昨日、「Rubyスクリプトの中に画像を入れておくことってできないのかな?」と疑問を持ったのだけど。どうやら簡単に(?)できるらしいと分かったのでメモ。

テキストの中にバイナリデータを入れておく方法としては、一般的には 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==
bse64からバイナリに変換して表示


画像はコレ。Public Domain ってことで。

player.png
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 などは、実験用に使えるメソッドとかあったら便利なのだろうか。
k_img = Image.makeBear() # テスト用のクマさん画像を作成
m_img = Image.makeMiku() # テスト用の初音ミク画像を作成
みたいな。学習用ライブラリとして強化するなら、そういうのも有効かもしれない?

まあ、そのへんは、enchant.js に任せるべきなのかな…。あっちのクマさん画像は、子供達に訴求力ありそう。

Scratch も、その手の画像があらかじめ入ってるけど。あの絵柄で喜ぶのはアメリカンな子供達だけだろうな…。

参考になった記事をメモ。 :


以上です。

過去ログ表示

Prev - 2013/12 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project