【问题标题】:How to convert list of bytes generated from PNG to RGB values of each pixel?如何将 PNG 生成的字节列表转换为每个像素的 RGB 值?
【发布时间】:2018-09-08 13:36:41
【问题描述】:

我试图弄清楚如何加载 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 值进行分组(从左上角开始向右移动,或者从左上角开始向下移动)等)

【问题讨论】:

  • PNG data format 不仅仅是一个简单的 RGB 值数组,它也可能被压缩。
  • ...它也被 压缩了。是的,您也在阅读元数据和其他内容。使用 PNG 库读取 PNG 文件,没有必要重新发明轮子。

标签: arrays ruby image-processing pixel bytestream


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 2020-11-09
    • 1970-01-01
    相关资源
    最近更新 更多