2017-05-20 15 views
0

私はRubyで画像処理スクリプトを持っています。私は配列内のすべてのピクセルを取得し、画像ノイズを作るためにランダムなピクセルを変更するスクリプトを実行します。しかし、私はこのピクセルを取得すると、私はエラーを持っています。ここに私のコードです。Rubyに配列の要素がありません

require 'mini_magick' 
first_image = MiniMagick::Image.new("123.png") 
a = 0 
b = 0 

pixels = first_image.get_pixels 
loop do 
    print "\n" 
    a=a+1 
    while pixels[a][b] != nil do 
    print pixels[a][b].to_s + "\n" 
    b+=1 
    end 
    b = 0 
    break if pixels[a][b] == nil 
end 

そして、これは私がターミナルで受け付けておりますものです:

Imagenoise.rb:10:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError) 
    from Imagenoise.rb:7:in `loop' 
    from Imagenoise.rb:7:in `<main>' 
+0

'first_image.pixels'の出力は何を? –

+0

これは、画像のピクセルの行列を取り出すことができるgem minimagick(https://github.com/minimagick/minimagickによる)のメソッドです。ここでは、行列の各要素は0から3までの3要素の配列です-255、RGBカラーチャンネルの各範囲に1つ。 –

+0

そしてそのループでは、2次元配列ピクセル[height] [wifth]の各要素を出力しています。出力は[24,30,28] [29,36,29] [107]です。 118、102] [175、189、166] ' –

答えて

0

pixels[a]がnilので、pixels[a][b]あるので、それがエラーを投げているエラーにされます。エラーを防ぐために、このようなことをすることができます。

while pixels[a] != nil do 
    print pixels[a][b].to_s + "\n" 
    b+=1 
end 
1

あなたのコードでは、画像の最後に達したかどうかを確認しません。したがって、を呼び出すことができないため、pixels[a]はある時点でnilを返します(aは画像のピクセル数より大きく、pixel[a][b]は失敗します)。

あなたは、配列を手動で反復しないことによって、そのような事態を回避し、代わりにeachブロックを使用することができます

require 'mini_magick' 

image = MiniMagick::Image.new('123.png') 
pixels = image.get_pixels 

pixels.each do |pixel| 
    pixel.each do |color| 
    puts color 
    end 
end 
+0

うん、これです!どうもありがとうございました。 –

関連する問題