- ベストアンサー
プログラミング言語 rubyを用いて、
プログラミング言語 rubyを用いて、 画像処理プログラミングを書こうとしていますが、以下の点が分かりません。 1・メモリの動的確保はどうするの?(C言語でいうmalloc) 2・ファイルから配列に展開するにはどうしたらいいの? 以上が分かればわかるきがするのですが・・ 当方 C言語での画像処理プログラミングはそれなりに経験があるのですが rubyで実現できるのかわからなくて・・
- みんなの回答 (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_A5C6A5F3A5D7A5ECA1BCA5C8CAB8BBFACEF3.html numarray = buf.unpack("i*") #int型の配列に変換。
その他の回答 (2)
- notnot
- ベストアンサー率47% (4900/10358)
>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が型(クラス)の区別を厳密にするので、ファイルから読み込んだ物はバイト列で、バイト列を整数と解釈するためには明示的な変換が必要です。
- nemuiq1
- ベストアンサー率50% (1/2)
1.メモリ動的確保 Rubyはガーベッジコレクタによるメモリ自動管理なので、 意識しなくても自動で確保・開放がされます。 メモリを意識しない分、「本来やりたい実装」に集中できます。 Javaもそんな感じです。(全く同じ仕組みで開放するのかは知りませんが) 意図的にfreeにする方法もあるのでしょうが、私はやったことがないから分かりません。 探してみたらこんなサイトを見つけたのでURLをば。 <<http://www.ruby-lang.org/ja/man/html/DL_PtrData.html>> 試してみて、うまくいけたら教えてください^^ 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
お礼
ご回答ありがとうございます いくつかヒントを下さりありがとうございます。 私がとりあえず実現したいのは、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を取得してから、 ループ等で、書き込みたいのです。