用户想要编写一个 Python 脚本,可以从透明背景的精灵图集中裁剪出精灵并保存为图像。精灵可以是矩形或正方形。用户希望脚本能够扫描精灵图集,找到所有非透明像素并确定精灵的轮廓,然后将精灵裁剪出来并添加透明背景。
2. 解决方案
该问题可以使用 Python Imaging Library (PIL) 来解决。PIL 是一个用于处理图像的 Python 库。PIL 可以用来加载精灵图集,获取像素数据,并创建新图像。
以下是问题的具体解决方案:
- 使用 PIL 加载精灵图集并获取像素数据。
- 遍历像素数据,查找非透明像素。
- 当找到一个非透明像素时,开始搜索其周围的非透明像素,以确定精灵的轮廓。
- 将精灵的轮廓中的像素添加到一个元组中,然后将元组推入一个图像中。
- 将图像保存为文件。
如果精灵不是矩形或正方形,则需要在精灵的周围添加透明背景以使其成为矩形或正方形。可以使用 PIL 的 Image.new() 函数来创建新的透明背景图像。
以下是解决方案的代码示例:
from PIL import Image
from sys import argv, exit
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!")