電子書籍の厳選無料作品が豊富!

プログラミング言語 rubyを用いて、
画像処理プログラミングを書こうとしていますが、以下の点が分かりません。

1・メモリの動的確保はどうするの?(C言語でいうmalloc)
2・ファイルから配列に展開するにはどうしたらいいの?

以上が分かればわかるきがするのですが・・

当方 C言語での画像処理プログラミングはそれなりに経験があるのですが
rubyで実現できるのかわからなくて・・

A 回答 (3件)

1.


rubyではメモリを確保する必要はありません。必要なときに動的に確保されて、使用されなくなったら自動で開放されます。
どうしても確保したいときは、
str = " " * 256
等とすれば、(char*)型のようなものが確保できます。
外部プログラムを呼び出すときに、バッファが必要と指定されているのであれば、上記のように確保しておきます。(win32APIを使うときに目したくらいで、大抵は使わないと思います)
メモリ開放をどうしても手動で制御したいときは、
http://www.ruby-lang.org/ja/man/html/GC.html
を参照するとよいです。

2.
ファイルからのバイナリ読み込み例は
$KCODE="NONE" #←文字列等をバイト型で扱う
file = File.open("hoge.bmp")
file.binmode #←windowsの場合に必要
file.seek(10)
buf = file.read(4)
file.close
等とすれば、最初からオフセット10から4バイト読み込みます。詳細はFileとIOのリファレンスを参照ください。
(FileのスーパークラスがIOなのでFileオブジェクトからは両方のメソッドが使えます。)
http://www.ruby-lang.org/ja/man/html/File.html
http://www.ruby-lang.org/ja/man/html/IO.html
readで読み込んだ戻り値は、文字列(Stringクラスのオブジェクト)ですから、上記例なら、
buf[0] #←オフセット10の文字コード(バイナリ値)
buf[0,1] #←オフセット10の1バイトの文字列
buf[1,2] #←オフセット11から2バイトの文字列
ということになります。
ちなみに、Stringクラスはバイナリ情報も扱えます。詳細はStringリファレンスを参照ください。
http://www.ruby-lang.org/ja/man/html/String.html
byte型以外のバイナリを扱うには、unpackメソッドを使いますのでこちらのリファレンスも参照ください。
http://www.ruby-lang.org/ja/man/html/pack_A5C6A5 …
numarray = buf.unpack("i*") #int型の配列に変換。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます
いくつかヒントを下さりありがとうございます。

私がとりあえず実現したいのは、bmpを読み込んで、そのまま別のファイルにbmpとして吐き出す
ことなのですが、


$KCODE="NONE" #←文字列等をバイト型で扱う
file = File.open("Valhalla.bmp")
file.binmode #←windowsの場合に必要
file.seek(18)
width=file.read(4)
file.seek(22)
height=file.read(4)
print("width = ",width, "\n")

file.seek(54)
buf = file.read(3)
file.close

の様に書いているのですが、、、printの段階で、コンソールに width= 空白
となってしまったりして本当に値がとれているのかわからなくて・・・

申し訳ありませんが

bmp→bmpを教えて頂けないでしょうか

単純に全部のメモリを読み込んで 全部書き込むといった方法ではなく
width,heightを取得してから、

ループ等で、書き込みたいのです。

お礼日時:2010/10/13 20:32

>width=file.read(4)


>print("width = ",width, "\n")

空白じゃなくて、バイナリをそのまま出力しているはずです。ファイルにリダイレクトして16進表示でもしてみるとわかります。

widthに入った4バイトのバイト列を、リトルエンディアン符号無し32bit整数として解釈したいと言うことだと思います。

width.unpack("V")[0]

で、整数値が得られます。

Cは型が弱いので、int変数にファイルから読み込んだり出来ますが( fread(&n, sizeof(int),1,fp) )、Rubyが型(クラス)の区別を厳密にするので、ファイルから読み込んだ物はバイト列で、バイト列を整数と解釈するためには明示的な変換が必要です。
    • good
    • 0

1.メモリ動的確保


Rubyはガーベッジコレクタによるメモリ自動管理なので、
意識しなくても自動で確保・開放がされます。
メモリを意識しない分、「本来やりたい実装」に集中できます。
Javaもそんな感じです。(全く同じ仕組みで開放するのかは知りませんが)

意図的にfreeにする方法もあるのでしょうが、私はやったことがないから分かりません。
探してみたらこんなサイトを見つけたのでURLをば。
<<http://www.ruby-lang.org/ja/man/html/DL_PtrData. …

試してみて、うまくいけたら教えてください^^


2.ファイルから配列に
csvファイルですが、ちょうど実装した直後なので参考になれば。


require "csv"

class Main
def initialize
 #変数の初期化
 @hairetsu = []
 filenm = "filename001.csv"
 
 #csvファイル読み込み
 csvRead(filenm)
  
end

def csvRead(file)
 #ファイルをオープン
 csvReader = CSV.Open(file)
 #ファイルを1行ずつ読み込む
 csvReader.each{|row|
  #配列に1行分を入れる
  @hairetsu << row.join(",")
 }
 #ファイルを閉じる
 csvReader.close
end

end
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!