Ruby

时间:2017-05-20 10:20:29

标签: 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>'

2 个答案:

答案 0 :(得分:1)

您的代码不会检查您是否到达了图片的末尾。因此,pixels[a]会在某个时刻返回nil(一旦a大于图片中的像素数),pixel[a][b]会失败,因为您无法调用nil[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

答案 1 :(得分:0)

抛出错误是因为pixels[a]为零,因此pixels[a][b]出错。你可以做这样的事情来防止错误。

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