我正在尝试打开一个图像文件,并在变量/数组中按颜色存储像素列表,这样我就可以逐个输出它们。
图片类型:可以是BMP,JPG,GIF或PNG。其中任何一个都很好,只需要支持一个。 颜色输出:RGB或Hex。
我看了几个图书馆(RMagick,Quick_Magick,Mini_Magick等),他们看起来都有点矫枉过正。 Heroku在ImageMagick上也遇到了一些困难,我的测试也没有运行。我的申请是在Sinatra。
有什么建议吗?
答案 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编写的,因此您可以查看代码的工作原理。文档很好地显示了标题块和字段,您可以使用该应用程序读取/写入值。
我正在测试一个新的路由器,所以我没有机会测试该代码,但它应该很接近。我会稍微检查一下,如果不起作用,请更新答案。