2

在我玩的一款名为 Starbound 的游戏中,我正在尝试创建一个改装项目。在游戏中,物品代码基于 JSON 字符串。我创建的项目上的字符串示例使用以下 JSON 来区分游戏中的可绘制项目:

[{
    "image":"/particles/ash/3.png?setcolor=090909",
    "position":[0,0]
},
    ... and so on for each pixel in the image ...
]

有没有一种方法可以让我在图像编辑软件中以 PNG 格式创建一个精灵,保持透明度,并将颜色和像素位置栅格化为这种 JSON 格式?类似于将PNG图像转换为这种格式的批处理文件就可以了。(我可以手动编写 JSON,但我真的不想这样做。)

据我了解,该游戏提供了一些有限的图块,您可以使用它们来绘制图像。一般来说,我的图像应该根据他们提供的图块被光栅化成这种 JSON 格式:

[ { "image": "tile.png?setcolor=FFFFFF", "position": [X,Y] }, ... ]

(在这种格式中,setcolor变量可以是任何六位十六进制代码颜色)。

4

1 回答 1

1

使用红宝石

您需要安装两个 gem:rmagickcolor.

代码相当短:

require 'Rmagick'
require 'color'
require 'json'

def rasterize_to_json(inImagePath, outJsonPath)
  image = Magick::Image.read(inImagePath)

  pixels = []

  image.each_pixel do |px,col,row|
    hsla = px.to_hsla
    if hsla[3] > 0.75 # ignore pixels that are less than 75% opaque
      # Need to convert the HSL into HTML hex code (dropping the '#')
      hexcode = (Color::HSL.new(*hsla[0,2]).to_rgb.html.upcase)[1,6]
      pixels << { :image => "/tile.png?setcolor=#{hexcode}", :position => [col, row] }
    end
  end

  f = File.new(outJsonPath, "w")
  f.write(pixels.to_json)
  f.close
end

您可以添加一些其他位以使其可从命令提示符运行,或者仅require将其放入irb并在那里调用该函数。

于 2015-07-04T05:49:50.137 回答