Я создаю скрипт python, который может вырезать спрайты из прозрачного фона spritesheet. Я хочу вырезать спрайты в квадрате или прямоугольнике. Пока что моя идея заключается в следующем:Спрайте наброски и сохранение
1. Получите все пиксельные данные с листа.
2. Поиск непрозрачных пикселей.
3. Когда такой пиксель найден, начните оглядывать его для других непрозрачных пикселей, чтобы вы могли правильно получить изображение.
4. Добавить найденные пиксели в кортеже, которые затем попадают в изображение и сохраняются.
(спрайтов МОЖЕТ БЫТЬ УСТАНОВЛЕН неровно НА БАЛАНС)
Если спрайт неровный, я буду проверять его размеры, а затем добавить немного прозрачным фоном с боков его, так что он становится квадрат или прямоугольник. Например, у вас есть изображение размером 53x47. Я добавлю 19 и 25 пикселей прозрачного фона на обе стороны, чтобы он стал прямоугольником.
Я использую PIL, если есть лучший способ сделать это, не стесняйтесь делиться им. Если у вас есть лучший способ сделать это, поделитесь также.
Это мой код до сих пор, я не могу понять, как добавить прозрачный фон по сторонам и как правильно выполнить выделение, также я не могу заставить функцию neighbourPixels работать правильно, и это делает закрытым петля.
from PIL import Image
from sys import argv, exit
# Functions
def neighbourPixels(pixels, row, column):
pixel = pixels[row, column]
data = tuple()
holder = tuple()
while pixel != 0:
if pixels[row+1, column][3] != 0:
holder = pixels[row+1, column]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 1"
break
elif pixels[row, column+1][3] != 0:
holder = pixels[row, column+1]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 2"
elif pixels[row+1, column+1][3] != 0:
holder = pixels[row+1, column+1]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 3"
elif pixels[row-1, column][3] != 0:
holder = pixels[row-1, column]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 4"
elif pixels[row, column-1][3] != 0:
holder = pixels[row, column-1]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 5"
elif pixels[row-1, column-1][3] != 0:
holder = pixels[row-1, column-1]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 6"
elif pixels[row+1, column-1][3] != 0:
holder = pixels[row+1, column-1]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 7"
elif pixels[row-1, column+1][3] != 0:
holder = pixels[row-1, column+1]
data += (holder,)
pixel = pixels[row+1, column]
print "In box 8"
else:
print "Sprite has been outlined."
pixel[3] = 0
sprite = Image.new("RGBA", (len(data), len(data)))
sprite.putdata(data)
return sprite
# Main
if len(argv) < 4:
raise ValueError("Not enough arguments")
# Inicialization & Declatation
framesToCut = int(float(argv[2]))
frameSize = int(float(argv[3]))
frameToSave = Image.new("RGBA", (frameSize, frameSize))
frameCounter = 0
pixelTuple = tuple()
currentTuple = tuple()
# Preparing data
sheet = Image.open(argv[1])
width, heigth = sheet.size
pixels = sheet.load()
# Manipulation
for row in xrange(width):
for column in xrange(heigth):
# Searching for a pixel whos transparency is != 0
currentPixel = pixels[row, column]
if currentPixel[3] != 0:
print "Pixel found!"
print "Finding the sprite!"
sprite = findPixels(pixels, row, column)
if frameCounter <= framesToCut:
# left, upper, right, lower
frameCounter += 1
sprite.save(str(frameCounter), "PNG")
print "Sprite saved!"
else:
exit("Sprites were made O.o - Check 'em!")
Я не думаю, что спрайты имеют постоянное значение. Алгоритм выглядит как вещь, в которой я нуждаюсь, но можете ли вы сказать мне, будет ли она работать для спрайта вроде этого здесь -> [This] (http://www.spriters-resource.com/resources/sheets/39/ 42176.png) Фон прозрачен. –
Несомненно, это сработает. Я предлагаю вам создать копию изображения только для определения контура. Копия будет содержать только черно-белую информацию (двоичную). В зависимости от того, какие цвета и прозрачные пленки должны быть включены в изображение, вы поворачиваете области в черный цвет внутри этого изображения. Эта процедура даст вам свободу выбора желаемых областей. – fuesika
Хмм, можете ли вы дать мне пример кода о том, как использовать сам алгоритм? Я понимаю, как сделать серию серого, а затем помещать ее в массив numpy, но тогда я не знаю, как использовать алгоритм и поместить каждый результат в цветной файл изображения. –