0

我试图弄清楚如何加载 PNG 图像并创建一个包含每个像素的 RGB 值的矩阵。我目前正在使用以下方法来加载文件并获取各种 RGB 值:

  def to_pixels
    File.open(@file, 'r') do |file|
      byte_block = file.read
      byte_block.each_byte do |byte|
        @pixels << byte
      end
    end
  end

据我了解,每个像素包含代表 R、G 和 B 值的 3 个字节。我最初尝试将输出数组 @pixels 分组为 3 个元素的子组,假设每个像素的像素顺序和 RGB 值都保留在我的输出中。例如:

@pixels = @pixels.each_slice(3).to_a

我创建的数组长度与原始图像中的总像素数几乎相同,因此我受到鼓舞。但是,我使用 ChunkyPNG 将我的 RGB 像素阵列打印回图像,它看起来像随机颜色噪声。输入的某些字节可以@pixels代表元数据吗?或者,输出的字节可能不会被排序为 R,G,然后是单个图片的 B 值,而是可能是所有 R 字节,然后是所有 G 字节,然后是所有 B 字节?

我想弄清楚如何将字节数组转换为以某种逻辑顺序对图像的 RGB 值进行分组的数组数组(从左上角开始向右移动,或者从左上角开始向下移动等)

4

1 回答 1

0

chunky_png gem 可以做到这一点。https://github.com/wvanbergen/chunky_png

就像是:

img = ChunkyPNG::Image.from_file(@file)
img.pixels.each do |pixel|
 puts ChunkyPNG::Color.to_hex(pixel) # would spit out a hex string like "#b8e1f6ff"
end

如果您想要不同的格式,还有许多其他方法:to_grayscale、to_grayscale_alpha_bytes、to_grayscale_bytes、to_hex、to_hsb、to_hsl、to_hsv、to_s、to_truecolor_alpha_bytes、to_truecolor_bytes。

于 2018-09-08T16:44:50.127 回答