Posted by yamada on 2010/04/29 – 16:42
Filed under Ruby
Tagged as PNG, Ruby, snippet
ちょっとPNGの中身(ヘッダー情報とか画像以外の情報も)を見てみたくなったので、Rubyでスクリプトを書いてみました。

PNGファイルをパースする
以下のコードのポイントは「バイナリファイルの開き方」「バイナリファイルの走査」「PNGフォーマットに基づいたチャンク読み込み処理」「String#unpackによるバイナリデータの変換」です。
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
32
33
34
35
36
37
38
39
40
41
42
43
44
| ########################################
# testPNG.rb
# 2010/04/29
########################################
# 指定PNGファイルの情報を処理します.
def checkPNGInfo( filename, logfile )
png = File.open( filename, "rb" ) # バイナリモード読み込み用モード.
if png != nil then
# PNGファイルシグネチャ .. 8byte固定(89 50 4E 47 0D 0A 1A 0A).
png.read( 8 )
# IHDRチャンク イメージヘッダ .. 25byte固定.
png.read( 25 )
# チャンク毎に読み進める.
loop do
if png.eof?
logfile.print "DONE!\n"
break;
end
# read Length (4byte)
length = png.read( 4 ).unpack('N') # "big endian unsigned 32bit"で1文字読み込み.
length = length[0].to_i
logfile.print "length["+length.to_s+"]\n"
# read Type (4byte)
type = png.read( 4 )
logfile.print "type ["+type+"]\n"
# read contents
data = png.read( length )
# read CRC (4byte)
crc = png.read( 4 )
logfile.print "\n"
end
end
end
#------------------------------------------------------------#
# main
#------------------------------------------------------------#
f = File.open("log.txt", "w") # ログ出力ファイル.
if ARGV[0] == nil
print "usage: ruby testPNG.rb <filename.png>"
else
checkPNGInfo( ARGV[0], f )
end |
String#unpack
バイナリデータから数値への変換オプションにはいろいろな指定があるのですが、一番重要なのは、次の4つだと思います。
- n: big endian unsigned 16bit
- N: big endian unsigned 32bit
- v: little endian unsigned 16bit
- V: little endian unsigned 32bit
上記コードでは、21行目で unpack(‘N’) と読み込んでいます。
参考サイト
参考にしたのは下記のサイトです。ありがとうございました!
[AD]
↓失敗から学ぶ。その1.
↓失敗から学ぶ。その2.
Posted by yamada on 2010/04/28 – 22:56
Filed under Ruby
Tagged as Ruby, snippet
ちょっと書いたコードの断片をメモしておきます。
Rubyってしばらく書き続けていると便利なんですが、あまり書かないとライブラリの使い方とかそういうところで詰まるので。
ファイルの行数をカウントする
以前書いたファイルの行数を調べるコードを、ちょっと修正したモノを載せます。

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
| ########################################
# countLines.rb
#
# usage:
# %ruby countLines.rb <filename>
########################################
#------------------------------#
# functions
#------------------------------#
# 指定ファイルの行数を返します.
def getNumLine( filename )
File.open( filename ) { |file|
nil while file.gets # ファイル末尾まで移動.
return file.lineno # 現在の行番号を出力.
}
return -1 # error.
end
#------------------------------#
# main
#------------------------------#
filename = ARGV[0]
if filename == nil
print "usage: ruby countLines.rb <filename>"
else
print "--> "+getNumLine(filename).to_s + " lines in <"+filename+">"
end |
ポイントは、引数の使い方と、ファイルの現在の行番号を出力するFile#linenoの使い方、の2点です。
[AD]
↓持っているRuby書籍の中で一番良いと思うのがこれ。

プログラミングRuby 第2版 言語編
著者/訳者:Dave Thomas Chad Fowler Andy Hunt
出版社:オーム社( 2006-08-26 )
定価:¥ 3,990
Amazon価格:¥ 3,990
大型本 ( 434 ページ )
ISBN-10 : 4274066428
ISBN-13 : 9784274066429
↓第1章が「テストでコードを駆動する」となっていたり良書の予感!
Posted by yamada on 2010/01/19 – 23:02
Filed under Ruby
Tagged as ImageMagick, Ruby
ローカル環境にある大量にある画像の情報を取得してみたくて、どうしようかと悩み、RMagickを使うことにしたときのメモです。
他のライブラリについて
結論から言うと、ImageMagick + RMagickというRubyライブラリを使うことで問題は解決したのですが、そこにたどり着くまでの経緯をメモしておきます。
まず、検討している作業環境はWindowsなのですが、Rubyをかまして処理したくて、あれこれとライブラリを検討してみました。
最初に悩んだのはライブラリ。画像処理ライブラリをあれこれ探してみたら、だいたいがLinux系のライブラリの情報が見つかります。それに惑わされ、imlib2、GDという2つのライブラリを入れようとしていましたが、どうにもその後のrubyライブラリを入れるところで躓き、なかなか環境が構築できませんでした。
Windowsインストーラが素晴らしいImageMagick
最後に試したのがImageMagick。
これはWindows版のインストーラもきちんとあり、DLLも配置してパスまで通してくれるので、これが一番でした。
インストーラも上記サイトで公開されているのですが、Ruby(RMagick)で使いたい人はダウンロードをちょっと待ってください。
RMagickサイコー!
私の場合Rubyで処理をしたくて、次に悩んだのが、RubyのImageMagickラッパーライブラリの選択。
gemで探してみるといくつか見つかりますが、最初に試したのがquick_magick。しかし、動作がおかしくてあきらめました。
次に試したのが、RMagick。
まず、Windows版のインストーラですが、このページの下部の「rmagick-win32」というところにあります。
「RMagick-2.12.0-ImageMagick-6.5.6-8-Q8.zip」というファイルをダウンロードすると、その中にWindows版のImageMagickのインストーラも入っています。
このバージョンでしか整合性がとれないよ、ということなのですが、こうしてインストーラまで含めておいてもらえると助かりますね!この気配りは、他のライブラリではあまり見たことない形式だったのでちょっとうれしかったです。
インストール手順ですが、そのImageMagickをインストールし、その後、下記のようなコマンドでファイルに含まれているgemファイルを実行して、RMagickをインストールします。
gem install rmagick-2.12.0-x86-mswin32.gem
RMagickのサンプルコード
画像を読み込み、その縦横サイズを出力するサンプルコードを載せておきます。
[ruby]
require ‘RMagick’
include Magick # ライブラリの初期化.
filename=”C:/test/ruby/test.png”
i = Image.read(filename).first
print filename+”:["+i.columns.to_s+"x"+i.rows.to_s+"]”
[/ruby]
RMagickのHTMLヘルプ
RMagickのライブラリリファレンスですが、微妙に見にくかったりするので、2nd lifeさんがつくられたHTMLヘルプ(.chm)が便利です。3年前のモノですが、私のようなRMagick初心者には十分使えるものとなっています。
[AD]
↓日本語の解説書。

ImageMagick逆引きコマンドリファレンス
著者/訳者:クーガー株式会社 石井 敦
出版社:インプレスジャパン( 2008-11-28 )
定価:¥ 3,780
Amazon価格:¥ 3,780
大型本 ( 308 ページ )
ISBN-10 : 4844326473
ISBN-13 : 9784844326472
↓洋書ですが、良さそうな雰囲気。
Posted by yamada on 2009/11/17 – 09:00
Filed under Ruby, Windows
Tagged as exe, exerb, Ruby
何年かぶりにexerbを使ってみたら、使いやすかったので、その使い方をメモしておきます。
exerb(イグザーブ)とは
exerbとは、rubyスクリプトを、exe形式に書き出すプログラムです。
ちょっとしたテキストコンバートとか、テキスト処理ツールを作りスタッフに配布するにはとても便利です。
インストール
下記公式サイトから最新版のzipパッケージをダウンロードして適当な場所に展開します。
その後、展開したディレクトリに入り、以下のコマンドを実行したらインストールは完了です。
$ ruby setup.rb
exeを作る方法(1)
exerbでrbファイルからexeを作るには基本的にはレシピファイルと呼ばれるコンフィグファイルを作る必要があります。
しかし、exerb 4.0からは、特殊なライブラリを使っていなければ、レシピファイルを作らなくても書き出すことが出来るようです。
$ exerb doSomething.rb -> doSomething.exeが生成されます
exeを作る方法(2)
レシピファイル(.exy)を使う方法は次のようになります。
$ mkexy doSomething.rb -> doSomething.exyが生成されます
$ exerb doSomething.exy
レシピファイルはYAMLフォーマットなので、簡単にいじることが出来ます。
私はまだ必要に迫られてないので、レシピファイルをいじってないのですが、例えば、バージョン情報を設定できたり、リソースデータなどを読み込むことが出来るようです。
exerb、最高に便利!
[AD]
↓第1版を持っていますが、あまり頻繁にRubyに触らない人にこそお勧め。

Rubyレシピブック 第2版 268の技
著者/訳者:青木 峰郎 後藤 裕蔵 高橋 征義
出版社:ソフトバンク クリエイティブ( 2007-02-01 )
定価:¥ 2,940
単行本 ( 480 ページ )
ISBN-10 : 4797340045
ISBN-13 : 9784797340044
↓amazonの評価は低いけど、個人的には悪くないと思う。

Linkers & Loaders
著者/訳者:John R. Levine
出版社:オーム社( 2001-09 )
定価:¥ 3,360
Amazon価格:¥ 3,360
単行本 ( 239 ページ )
ISBN-10 : 4274064379
ISBN-13 : 9784274064371