Как мне преобразовать изображение спрайта в JSON для мода Starbound?

В игре, в которую я играю под названием 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 переменная может быть любого шестизначного цвета шестнадцатеричного кода).

1 ответ

Используйте Ruby

Вам нужно будет установить два драгоценных камня: rmagick а также color,

Код довольно короткий:

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 и вызвать функцию там.

Другие вопросы по тегам