2010-12-03 12 views
8

画像ファイルを開いて変数/配列に色でピクセルリストを格納しようとしています。Rubyでピクセル単位で画像を読み取る

画像の種類:BMP、JPG、GIF、PNGのいずれかです。それらのいずれも問題なく、サポートする必要があるのは1人だけです。 カラー出力:RGBまたはHex。

私はいくつかのライブラリ(RMagick、Quick_Magick、Mini_Magickなど)を見てきましたが、それらはすべて過度のようです。 Herokuはまた、ImageMagickでいくつかの問題を抱えています。私のテストは実行されません。私のアプリケーションはSinatraにあります。

提案がありますか?

答えて

13

これにはRmagickeach_pixelメソッドを使用できます。 each_pixelはブロックを受信します。各ピクセルについて、ブロックはピクセル、ピクセルの列番号および行番号を渡される。これは、ピクセルを左から右、上から下に反復処理します。

だから、何かのように:

pixels = [] 

img.each_pixel do |pixel, c, r| 
    pixels.push(pixel) 
end 
# pixels now contains each individual pixel of img 
+0

好奇心が強い。この場合のRmagickのパフォーマンスはどうですか?私は、ルビーのフロントエンドを利用する趣味としてゲームエンジンで作業し、ビルトインのビットマップクラスは、ピクセルごとのアクセスに関して非常に遅いです。 –

+0

オリジナルの質問は、著者がRMagickを見て、それが「過剰なもの」であると判断したと述べています。 – Phrogz

+2

@Phogzだからあなたはdownvote? OPはそれが過労であると判断したとしても、そのことを意味するものではありません。もし彼らが本当に必要なものを知っていれば、彼らは尋ねなかったでしょう。この回答は正しいものであり、何が尋ねられますか。 – Alex

1

あなたはバイトのみを表示するようにファイルを開いているし、イメージとしてそれを操作する必要がない場合は、それがどのようにファイルを開くの簡単なプロセスですそれ以外の場合は、Xバイト数を読み取り、それらを反復処理します。次のようなものがあります。

File.open('path/to/image.file', 'rb') do |fi| 
    byte_block = fi.read(1024) 
    byte_block.each_byte do |b| 
    puts b.asc 
    end 
end 

これは単にバイトを10進数で出力します。あなたはバイト値を見て、色を決定するためにRGB値を構築したいので、each_slice(3)を使用し、3バイトの倍数で読むことが役に立ちます。

さまざまなイメージフォーマットには、タイプに応じて、キャプチャデバイスのイメージ、データフォーマット、およびEXIF情報に関する情報を保存するために使用される異なるヘッダーブロックとトレーリングブロックが含まれています。ファイルを読み込み、バイトを直接出力する場合(非圧縮TIFFなど)は、圧縮されていないものを使用するとよいでしょう。一度それを決めたら、ファイルにジャンプしてヘッダーをスキップするか、単にヘッダーを読んだり読んだりすることができます。 WikipediaのImage file formatsページは、利用可能なさまざまなフォーマットに関する詳細情報を得る良いジャンプ先です。

画像データのみを表示したい場合は、ハイレベルライブラリの1つが、画像の特定のセクションを取得するためのインタフェースを持っているので便利です。しかし、実際にバイトにアクセスすることは難しくないし、ジャンプすることもありません。

EXIFブロックについて詳しく知りたい場合は、多くの異なるベンダーのJpegおよびTIFF形式を記述するために使用されます。ExifToolは便利です。 Perlで書かれているので、コードの仕組みを見ることができます。ドキュメントではヘッダーブロックとフィールドがうまく表示され、アプリを使用して値を読み書きできます。

私は新しいルータをテストしているので、そのコードをテストする機会はありませんでしたが、それは近いはずです。それがうまくいかない場合、私はちょっと調べて答えを更新します。

+2

ファイルフォーマットがここで重要になることは知っていますか? –

+0

私は明確にする必要があります。 OPはヘッダー情報とそれ以外のもの、ピクセルデータだけを必要としないため、フォーマットの問題になります。 –

+0

OPはヘッダーがスキップされることを指定しません。もしあなたがおそらく仮定しているのであれば、OPにdownvoteではなく明確にするように頼むことができます。 –

14

私はChunky PNGあなたのためにそれを行う必要がありますと思います。これは純粋なルビーであり、合理的に軽量でメモリ効率が良く、ピクセルデータとイメージメタデータへのアクセスを提供します。

+0

+1、良いライブラリ。この答えは、「Chunky PNG」を使って何が求められるのかを示すコードスニペットを提供した方が良いでしょう。しかし、*このライブラリはPNGのためだけです。* OPは、ファイルが単なるPNG以上になる可能性があると具体的に述べています。 – Alex

+4

@AlexあなたはOPを誤解したと思います。 「いずれか1人は問題なく、1人しかサポートする必要がない」と言われています。私はそれがOPがライブラリに基づいて最も簡単なフォーマットの1つを使用することを意味すると解釈します。 – Phrogz

+0

正解、PNGのみをサポートしています。明らかにRMagickは必要ないと言われていますが、それでもImageMagickのサポートが必要ですか? –

関連する問題