2013-11-30 3 views
0

Я создаю скрипт 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!") 

ответ

0

Возможно, вы захотите использовать маршевые квадраты scikit-image [1]. Алгоритм, который вы ищете, уже реализован.

[1] http://scikit-image.org/docs/dev/auto_examples/plot_contours.html

редактировать: После того как вы контуры с использованием серо-масштабируется изображение * r_grey *, только сюжет цветные изображения и контуры на верхней части друг друга. Этот пример относится к примеру, приведенному в приведенной выше ссылке:

# Find contours at a constant value of 0.8 
contours = measure.find_contours(r_grey, 0.8) 

# Display the image and plot all contours found 
plt.imshow(r, interpolation='nearest') 

for n, contour in enumerate(contours): 
    plt.plot(contour[:, 1], contour[:, 0], linewidth=2) 

Исходный код сказал вам использовать г (образ) и построить ее. Это то, что мы продолжаем делать. Помните: серо-масштабированное и цветное изображение имеют одинаковые координаты.

+0

Я не думаю, что спрайты имеют постоянное значение. Алгоритм выглядит как вещь, в которой я нуждаюсь, но можете ли вы сказать мне, будет ли она работать для спрайта вроде этого здесь -> [This] (http://www.spriters-resource.com/resources/sheets/39/ 42176.png) Фон прозрачен. –

+0

Несомненно, это сработает. Я предлагаю вам создать копию изображения только для определения контура. Копия будет содержать только черно-белую информацию (двоичную). В зависимости от того, какие цвета и прозрачные пленки должны быть включены в изображение, вы поворачиваете области в черный цвет внутри этого изображения. Эта процедура даст вам свободу выбора желаемых областей. – fuesika

+0

Хмм, можете ли вы дать мне пример кода о том, как использовать сам алгоритм? Я понимаю, как сделать серию серого, а затем помещать ее в массив numpy, но тогда я не знаю, как использовать алгоритм и поместить каждый результат в цветной файл изображения. –

 Смежные вопросы

  • Нет связанных вопросов^_^