ruby - 在数组 Ruby 中保存像素颜色

标签 ruby minimagick

我使用 CarrierWave 和 MiniMagick 处理图像。我上传图片。现在我需要获取图像中所有像素的值并将它们存储到数组中

如果我使用下一个代码,它运行良好

def pixelcolor 
@image = MiniMagick::Image.open(image.path)     
return @image.get_pixels[56][34][1] # 56 and 34 - random numbers for row and column
end

下一个代码也能正常工作

def pixelcolor 
@image = MiniMagick::Image.open(image.path)     
width = @image.width
color = Array.new   
for i in 0..width
  color[i] = i
end
return color
end

但如果我尝试编写下一个代码,它就不起作用

def pixelcolor 
@image = MiniMagick::Image.open(image.path)     
width = @image.width
color = Array.new
for i in 0..width
    color[i] = @image.get_pixels[45][65][0]
end
return color
end

结果我需要这样的东西

def pixelcolor 
@image = MiniMagick::Image.open(image.path)     
width = @image.width
height = @image.height  
red = Array.new  
green = Array.new
blue = Array.new    
for i in 0..width
    for j in 0..height
      red[i][j] = @image.get_pixels[width][height][0]
      green[i][j] = @image.get_pixels[width][height][1]
      blue[i][j] = @image.get_pixels[width][height][2]
    end
end
return red, green, blue
end

很久以前,我在 C++ 中创建了非常相似的项目来处理图像,所以我知道要做什么,但不确定如何在 Ruby 中正确执行它,因为我是新手

最佳答案

您面临的问题源于 Ruby 没有“多维数组”的概念,单个数组始终是一维的

但是,您可以使用嵌套数组,这些数组包含数组,例如[[], [], []]


让我们来看看两个特定的地方:

red = Array.new # Note: this could as well be `red = []`

因此,您已为 red 分配了一个空数组。好吧。这是您稍后要做的:

red[i][j] = ...

我们甚至不需要线路的其余部分,它显然已经损坏了。

在第一次迭代中,red 仍然是一个空数组。因此,red[i]nil,因为里面绝对没有任何东西。 nil 没有数组访问器([][]=),因此您在尝试读取或写入它时会遇到错误就好像它是一个数组。

因此您需要red[i] 成为一个实际的数组,这样您就可以将数据放入其中。让我们实现它。

由于您事先知道数组的大小,因此您可以立即使用适当长度的数组分配和填充 red:

red = Array.new(width) { Array.new(height) }

例如,对于 width = 2height = 3,您会得到以下结果:

[
  [nil, nil, nil],
  [nil, nil, nil]
]

现在您已经分配了所有需要的单元格,您可以开始用有意义的东西覆盖 nil

参见 the docs for Array.new了解构造数组的各种方法。


小心:

出于某种原因,我使用了“ block 状”形式的 Array.new

初学者经常会错误地使用单个值来填充数组,如下所示:

red = Array.new(width, Array.new(height))

虽然这种形式有其用途,但它不会产生您需要的效果:red 中的所有条目都将引用同一个数组,因此修改任何一行看起来就像修改了所有行一样。


旁注:您可能想要交换维度中的widthheight,因为在图形程序中通常处理 数组,而不是列。不过要看情况。可能对您的特定问题没有任何影响。

关于ruby - 在数组 Ruby 中保存像素颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125072/

相关文章:

ruby-on-rails - 未初始化常量 CarrierWave::MiniMagic

ruby - 使用 Minimagick 操作像素

ruby-on-rails - clang:错误:无法执行命令:段错误:11

ruby - 在功能上找到通过测试的第一个值的映射

ruby-on-rails - Rails 3.0.7 -> 如何让测试运行得更快?

ruby-on-rails - 解析 JSON 时出错 : undefined method 'gsub'

ruby-on-rails - 如何使用 Carrierwave 和 MiniMagick (Ruby on Rails) 将 PDF 转换为图像数组

ruby-on-rails - MiniMagick 中的图像调整大小和裁剪算法

ruby net/http `read_body' : Net::HTTPOK#read_body 调用了两次 (IOError)