如何使用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
相关产品推荐
相关产品推荐

