Ruby中数组的Nil元素

Ruby中数组的Nil元素,ruby,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] !=

我有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>'

这是抛出错误,因为像素[a]为零,因此像素[a][b]出错。您可以这样做来防止错误

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

您的代码不会检查您是否到达图像的末尾。因此,一旦a大于图像中的像素数,像素[a]在某个点返回nil,并且像素[a][b]失败,因为您不能调用nil[b]

通过不手动迭代数组,而是使用每个块,可以避免这种情况:


first_image.pixels的输出是什么?这是gem Minimagik的一种方法,根据它我可以检索图像像素矩阵,矩阵的每个成员是一个3元素数组,数字在0-255之间,每个RGB颜色通道范围一个。对于该循环,当我打印二维数组像素[height][wifth]的每个元素时,我得到了输出[24,30,28][29,36,29][107,118,102][175,189,166],如果像素[a]返回零,你的代码将丢失一个中断。当a大于图像中的像素数时就会发生这种情况。是的,就是这样!非常感谢你。
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