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