如何在Ruby中使用CarrierWave和MiniMagick将图像像素颜色存入数组?
获取MiniMagick图像所有像素颜色值并存入数组
你已经搞定了单像素取值和基础数组创建,那咱们直接把这两部分结合起来,就能实现获取所有像素颜色值的需求啦!
完整实现代码
def pixel_colors # 打开上传后的图像文件 @image = MiniMagick::Image.open(image.path) # 获取图像的宽高参数 width = @image.width height = @image.height # 初始化二维数组来存储所有像素的颜色信息 all_pixel_colors = Array.new(height) { Array.new(width) } # 遍历每一行和每一列,逐个提取像素颜色值 height.times do |y| width.times do |x| # get_pixels返回结构为 [行][列][颜色通道],RGB模式下0=红、1=绿、2=蓝 # 若需要完整的RGB数组,直接取@image.get_pixels[y][x]即可 all_pixel_colors[y][x] = @image.get_pixels[y][x] end end all_pixel_colors end
代码细节说明
@image.get_pixels返回的是二维嵌套数组,索引顺序是行在前,列在后,比如get_pixels[56][34]对应的就是第57行、第35列的像素(索引从0开始)。- 如果只需要单个颜色通道的值(比如所有像素的绿色分量),可以把赋值语句改成
all_pixel_colors[y][x] = @image.get_pixels[y][x][1]。 - 用Ruby的
times方法替代for循环,代码更符合Ruby的简洁风格,可读性也更强。
小提醒
如果处理的是大尺寸图像,一次性把所有像素存入数组可能会占用较多内存。这种情况下可以考虑逐行处理后直接写入文件,而不是全部存在内存里,避免出现内存溢出的问题。
内容的提问来源于stack exchange,提问作者Димон Клименко
相关产品推荐
相关产品推荐

