如何从透明背景的精灵图集中裁剪精灵并保存

62 阅读2分钟

用户想要编写一个 Python 脚本,可以从透明背景的精灵图集中裁剪出精灵并保存为图像。精灵可以是矩形或正方形。用户希望脚本能够扫描精灵图集,找到所有非透明像素并确定精灵的轮廓,然后将精灵裁剪出来并添加透明背景。

2. 解决方案

该问题可以使用 Python Imaging Library (PIL) 来解决。PIL 是一个用于处理图像的 Python 库。PIL 可以用来加载精灵图集,获取像素数据,并创建新图像。

以下是问题的具体解决方案:

  1. 使用 PIL 加载精灵图集并获取像素数据。
  2. 遍历像素数据,查找非透明像素。
  3. 当找到一个非透明像素时,开始搜索其周围的非透明像素,以确定精灵的轮廓。
  4. 将精灵的轮廓中的像素添加到一个元组中,然后将元组推入一个图像中。
  5. 将图像保存为文件。

如果精灵不是矩形或正方形,则需要在精灵的周围添加透明背景以使其成为矩形或正方形。可以使用 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!")