在Ruby中逐个像素地读取图像

时间:2010-12-03 03:05:47

标签: ruby imagemagick heroku sinatra

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

图片类型:可以是BMP,JPG,GIF或PNG。其中任何一个都很好,只需要支持一个。 颜色输出:RGB或Hex。

我看了几个图书馆(RMagick,Quick_Magick,Mini_Magick等),他们看起来都有点矫枉过正。 Heroku在ImageMagick上也遇到了一些困难,我的测试也没有运行。我的申请是在Sinatra。

有什么建议吗?

3 个答案:

答案 0 :(得分:14)

您可以使用Rmagick的{​​{3}}方法。 each_pixel收到一个阻止。对于每个像素,块传递像素,列号和像素的行号。它从左到右,从上到下迭代像素。

类似于:

pixels = []

img.each_pixel do |pixel, c, r|
    pixels.push(pixel)
end
# pixels now contains each individual pixel of img

答案 1 :(得分:14)

我认为Chunky PNG应该为你做。它是纯粹的红宝石,相当轻巧,内存效率高,并且可以访问像素数据和图像元数据。

答案 2 :(得分:0)

如果您只是打开文件来显示字节,而不需要将其作为图像进行操作,那么这是一个打开文件的简单过程,就像读取任何其他文件一样,读取X个字节,然后迭代它们。类似的东西:

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值以确定颜色,因此可能使用each_slice(3)并读取3个字节的倍数将有所帮助。

各种图像格式包含不同的标题和尾随块,用于存储有关捕获设备的图像,数据格式和EXIF信息的信息,具体取决于类型。如果您要读取文件并直接输出字节,例如未压缩的TIFF,可能会使用未压缩的内容。一旦你决定了,如果你愿意,你可以跳转到文件中跳过标题,或者只是阅读那些也可以看到或了解它们中的内容。维基百科的Image file formats页面是一个很好的跳跃场所,可以获得有关各种格式的更多信息。

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

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

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