如何将从PNG生成的字节列表转换为每个像素的RGB值?

时间:2018-09-08 13:36:41

标签: arrays ruby image-processing pixel bytestream

我试图弄清楚如何加载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

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

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

我创建的数组的长度与原始图像中的像素总数几乎相同,因此受到鼓舞。但是,我使用ChunkyPNG提取RGB像素阵列并将其打印回图像,这看起来像是随机的色彩噪声。输入到@pixels中的某些字节可以表示元数据吗?还是输出的字节不按R,G排序,然后按单个图片的B值排序,例如所有R字节,然后是所有G字节,然后是所有B字节?

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

1 个答案:

答案 0 :(得分:0)

chunky_png宝石可以做到这一点。 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。