在Ruby中逐像素读取图像

在Ruby中逐像素读取图像,ruby,imagemagick,heroku,sinatra,Ruby,Imagemagick,Heroku,Sinatra,我正在尝试打开一个图像文件,并将按颜色的像素列表存储在一个变量/数组中,以便可以逐个输出它们 图像类型:可以是BMP、JPG、GIF或PNG。其中任何一个都可以,只需要支持一个。 颜色输出:RGB或十六进制 我看过一些图书馆(RMagick、Quick_Magick、Mini_Magick等),它们看起来都有些过分了。Heroku在ImageMagick方面也有一些困难,我的测试无法运行。我的申请在西纳特拉 有什么建议吗?您可以使用Rmagick的方法进行此操作每个像素接收一个块。对于每个像素,

我正在尝试打开一个图像文件,并将按颜色的像素列表存储在一个变量/数组中,以便可以逐个输出它们

图像类型:可以是BMP、JPG、GIF或PNG。其中任何一个都可以,只需要支持一个。 颜色输出:RGB或十六进制

我看过一些图书馆(RMagick、Quick_Magick、Mini_Magick等),它们看起来都有些过分了。Heroku在ImageMagick方面也有一些困难,我的测试无法运行。我的申请在西纳特拉


有什么建议吗?

您可以使用
Rmagick
的方法进行此操作<代码>每个像素接收一个块。对于每个像素,向块传递像素、像素的列号和行号。它从左到右、从上到下遍历像素

比如:

pixels = []

img.each_pixel do |pixel, c, r|
    pixels.push(pixel)
end
# pixels now contains each individual pixel of img
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

如果您打开文件只是为了显示字节,而不需要将其作为图像进行操作,那么这是一个简单的过程,可以像打开其他文件一样打开文件,读取X个字节,然后对其进行迭代。比如:

pixels = []

img.each_pixel do |pixel, c, r|
    pixels.push(pixel)
end
# pixels now contains each individual pixel of img
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
这将只输出十进制字节。您需要查看字节值并建立RGB值以确定颜色,因此使用
每个片段(3)
并以3字节的倍数读取可能会有所帮助

各种图像格式包含不同的标题和尾随块,用于存储有关图像的信息、数据格式和捕获设备的EXIF信息,具体取决于类型。如果您要读取文件并直接输出字节(例如未压缩的TIFF),那么使用未压缩的东西可能会很好。一旦你决定了,你可以跳转到文件中跳过标题,如果你想的话,或者也可以阅读这些标题来查看或了解其中的内容。Wikipedia的页面是一个很好的起点,可以获取更多关于各种可用格式的信息

如果您只想查看图像数据,那么其中一个高级库将有所帮助,因为它们具有获取图像特定部分的接口。但是,实际上访问字节并不难,也不难跳转

如果您想了解更多关于EXIF块的信息,可以方便地使用EXIF块来描述许多不同供应商的Jpeg和TIFF格式。它是用Perl编写的,因此您可以查看代码是如何工作的。文档很好地显示了标题块和字段,您可以使用应用程序读取/写入值


我正在测试一个新的路由器,所以我还没有机会测试该代码,但应该很接近了。我会检查一下,如果不起作用,我会更新答案。

我想我应该帮你做。它是纯ruby,相当轻量级,内存效率高,并提供对像素数据和图像元数据的访问。

只是好奇;在这种情况下,Rmagick的表现如何?我的业余爱好是使用ruby前端开发游戏引擎,而他们内置的位图类在逐像素访问方面非常慢。@Phogz所以你投了反对票?即使OP认为它是过度杀戮,但并不意味着它是过度杀戮。如果他们真的知道自己需要什么,他们就不会问了。这个答案是正确的,并且符合要求。对于大图像,这个方法可能会慢得令人烦恼。一个更快的方法是使用
img。将\u pixels\u导出到\u str
,然后从结果字符串中提取单个像素。这对我来说最简单。我之前确实认为这是一种过度杀伤力,只是假设有更简单的、基于非ImageMagick的方法来访问任何类型的图像像素。使用一些自动化脚本(包括ImageMagick安装),RMagick安装现在容易多了,我能够轻松访问像素;格式很重要,因为OP不需要标题信息等等,只是pixel data.OP不指定要跳过标题。如果你假设你可以要求OP澄清而不是向下投票。我引用“我试图打开一个图像文件,并将一系列像素按颜色存储在一个变量/数组中,这样我就可以一个接一个地输出它们。”这似乎很清楚。向下投票是区分好答案和坏答案/无用答案的方法。这个答案是错误的。它现在已经被编辑,但仍然没有回答这个问题。这不是针对个人的。虽然我理解选民们的意图,但这个答案对于OP的问题来说是完美的+除非问题被澄清,否则这个答案是正确的。如果您提供了一个使用
Chunky PNG
执行请求的代码片段,那么这个答案会更好。但是,此库仅适用于PNG。OP特别指出文件可能不仅仅是PNG。@Alex我认为您误读了OP。它说“任何一个都可以,只需要支持一个”。我认为这意味着OP将使用基于库的任何一种最简单的格式。它显然提到不需要RMagick,但它仍然需要ImageMagick支持吗?@AndersH如果您按照链接阅读自述文件的第一行,它会说:“此库可以读取和写入PNG文件。它是用纯Ruby编写的,以实现最大的可移植性。让我重新表述一下:它不需要RMagick或任何其他内存泄漏的映像库。“矮胖的PNG真的很棒——我强烈推荐它。我与RMagick的每一次经历最终都会导致SegFault和其他奇怪的崩溃。这不是一个万不得已的图书馆,如果需要加入任何用户输入,我肯定会对它感到非常厌倦。