2015-07-04 2 views
2

В игре, которую я играю, называется Starbound. Я пытаюсь создать измененный элемент. В игре код элемента основан на строках JSON. Пример строки на элементе, который я создал использует следующий JSON, чтобы отличить рисую деталь в игре:Как преобразовать изображение спрайта в JSON для мод Starbound?

[{ 
    "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 может быть любыми шесть цифр шестигранной код цвета).

+0

Вы говорите, что хотите сохранить прозрачность, но в вашем примере есть только те RGB-шестерки, которые не имеют возможности выражать прозрачность. Как отображается частично прозрачный пиксель в этом формате? Есть ли альфа-значение? Используют ли они цвет для обозначения прозрачности (например, волшебный фиолетовый, волшебный зеленый)? Будем ли мы иметь дело с частичной прозрачностью или пикселями исключительно полностью прозрачными или полностью непрозрачными? – doppelgreener

ответ

1

Использование Рубин

Вам необходимо установить два драгоценных камней: 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 и вызвать функцию там.