You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Ruby的RMagick将RGB像素数组生成对应图片

实现方案

首先明确你查到的import_pixels是MiniMagick库的API,并非RMagick的原生方法,两个库的调用逻辑差异较大。以下是两种适配RMagick的实现方式,可根据像素数组大小选择:

方法1:逐像素赋值(适合小尺寸图像,代码最直观)

你给出的示例是9行5列的小尺寸热点图,直接逐行逐列设置像素最容易理解,实现代码如下:

require 'rmagick'
include Magick

# 你的原始像素数组
imagepixels = [
        [[0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0]],
        [[0,0,0], [0,0,0], [255,0,0], [0,0,0], [0,0,0]],
        [[0,0,0], [0,0,0], [255,0,0], [255,0,0], [0,0,0]],
        [[0,0,0], [255,0,0], [255,0,0], [255,0,0], [0,0,0]],
        [[0,0,0], [255,0,0], [255,0,0], [255,0,0], [0,0,0]],
        [[0,0,0], [255,0,0], [255,0,0], [255,0,0], [0,0,0]],
        [[0,0,0], [0,0,0], [255,0,0], [255,0,0], [0,0,0]],
        [[0,0,0], [0,0,0], [255,0,0], [0,0,0], [0,0,0]],
        [[0,0,0], [0,0,0], [0,0,0], [0,0,0], [0,0,0]]
        ]

# 读取图像尺寸
rows = imagepixels.length
cols = imagepixels[0].length

# 新建对应尺寸的空白图像
img = Image.new(cols, rows)

# 逐像素赋值
rows.times do |y|
  cols.times do |x|
    r, g, b = imagepixels[y][x]
    # RMagick默认色深为16位,0-255的8位数值乘257可等比映射到0-65535的取值范围
    img.pixel_color(x, y, Pixel.new(r*257, g*257, b*257))
  end
end

# 导出为图像文件
img.write('hotspot_result.png')

方法2:批量导入像素(适合大尺寸图像,性能更高)

如果像素数组分辨率较高,逐像素赋值效率较低,可以用RMagick自带的import_pixels方法批量导入数据,实现代码如下:

require 'rmagick'
include Magick

imagepixels = [
  # 同上省略原始像素数组
]

rows = imagepixels.length
cols = imagepixels[0].length

# 将三维像素数组拍平为一维字节数组,顺序为R、G、B依次排列
pixel_blob = imagepixels.flatten.pack('C*')

# 新建空白图像
img = Image.new(cols, rows)
# 批量导入像素:参数依次为x偏移、y偏移、导入宽度、导入高度、色道映射、像素二进制数据、数据存储类型
img.import_pixels(0, 0, cols, rows, 'RGB', pixel_blob, CharPixel)

# 导出文件
img.write('hotspot_result.png')

该方案性能比逐像素赋值高10倍以上,适合分辨率超过1000*1000的图像场景。

内容的提问来源于stack exchange,提问作者Rich_F

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:18:00