我正在其中我需要单独spritesheets,或者换句话说, 图像分离成彩色的连续的区域的程序。
我以前从来没有做过任何图像处理,所以我不知道我怎么会去了解这一点。 我会做什么后,我测试的像素颜色? 什么是确定哪些像素与每个精灵去的最佳途径?
所有输入图像具有均匀的背景,并从该背景的不同alpha通道算作彩色。 需要输出图像的顺序进行左右,上下。 我的项目是写在PySide,所以我希望将它用于这个任务太,但如果需要,我可以进口更多的图书馆。
感谢您的答复!
PS:,我不知道,如果PySide标签是否适当,因为我使用PySide,但问题不涉及它的GUI方面。 如果国防部认为它不属于,可随时将其删除。
例如,我有一个spritesheet,看起来像这样:
我想把它分成以下:
这听起来像什么,应该在任何与精灵交易来实现,但在这里我们将实现我们自己的精灵spliter。
这里我们首先需要的是提取单个对象。 在这种情况下,它是唯一决定的像素是背景的一个或没有的事。 如果我们假设在始发点是背景像素,那么我们已经完成:
from PIL import Image
def sprite_mask(img, bg_point=(0, 0)):
width, height = img.size
im = img.load()
bg = im[bg_point]
mask_img = Image.new('L', img.size)
mask = mask_img.load()
for x in xrange(width):
for y in xrange(height):
if im[x, y] != bg:
mask[x, y] = 255
return mask_img, bg
如果保存mask
上面创建图像,并打开它,在这里你会看到它是什么(我加你的空窗内矩形):
通过上面的图片,我们需要接下来的事情是,如果我们想加入那些人里面的精灵,以填补其孔(如矩形添加,见上图)。 这是另一种简单的规则:如果一个点不能从点[0,0]达到,那么它是一个孔,它必须被填充。 所有剩下的就是分离,然后在单独的图像每个精灵。 这是通过连接的组件的标记来完成。 对于每个组件,我们得到它的轴对齐包围盒,以便限定所述片的尺寸,然后我们从原始图像复制属于一个给定的组件的各点。 为了简化,下面的代码使用scipy
这些任务:
import sys
import numpy
from scipy.ndimage import label, morphology
def split_sprite(img, mask, bg, join_interior=True, basename='sprite_%d.png'):
im = img.load()
m = numpy.array(mask, dtype=numpy.uint8)
if join_interior:
m = morphology.binary_fill_holes(m)
lbl, ncc = label(m, numpy.ones((3, 3)))
for i in xrange(1, ncc + 1):
px, py = numpy.nonzero(lbl == i)
xmin, xmax, ymin, ymax = px.min(), px.max(), py.min(), py.max()
sprite = Image.new(img.mode, (ymax - ymin + 1, xmax - xmin + 1), bg)
sp = sprite.load()
for x, y in zip(px, py):
x, y = int(x), int(y)
sp[y - int(ymin), x - int(xmin)] = im[y, x]
name = basename % i
sprite.save(name)
print "Wrote %s" % name
sprite = Image.open(sys.argv[1])
mask, bg = sprite_mask(sprite)
split_sprite(sprite, mask, bg)
现在你把所有的作品(sprite_1.png,sprite_2.png,...,sprite_8.png)完全一样,你列入问题。
文章来源: PySide: Separating a spritesheet / Separating an image into contiguous regions of color