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



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

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。

最新更新