Как мне преобразовать изображение спрайта в 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
и вызвать функцию там.