PIL无法切割图片无法保留alpha信息

近况

好像很久没有更新的样子了。现在都要准备考研了我想很长一段时间都不怎么会更新这里了
以上


正文

原先是打算把目录下的几张4*4的游戏行走图素材切割成单张图片使用的,所以用了Python写了段程序来切割图片,然而切割出来的图片背景都变成白色了,丢失了alpha信息。于是跟屌泽探讨了一下,稍微在这里记录下吧

下面是自己写的代码

import Image
import os
import sys
def image_split(pic_name):
    pic = Image.open(pic_name)
    size_sx = pic.size[0]/4
    size_sy = pic.size[1]/4
    region = (0,0,size_sx,size_sy)
    for x in xrange(1,17):
        print "    [+] spliting %i of %s...\t"%(x,file_name),
        img_crop = pic.crop(region)
        img_crop.save('splited\\'+pic_name[:-4]+'_'+"%i"%x+".png")
        print "[done]"
        if x%4 == 0:
            region = (0,region[1]+size_sy,size_sx,region[3]+size_sy)
        else:
            region = (region[0]+size_sx,region[1],region[2]+size_sx,region[3])

if __name__ == '__main__':
    print "[+] getting picture files ...\t\t",
    file_lst = os.listdir(os.getcwd())
    print "[done]"
    for file_name in file_lst:
        if file_name[-4:] == ".png":
            print "[+] spliting picture %s..."%file_name
            try:
                image_split(file_name)
            except Exception, e:
                pass

看起来好像是没什么问题
然后屌泽自己也写了段代码,说在他那里执行切割出来是带有alpha信息的

# def test():
#     # 1  1
#     # 2  4 8 6 2
#     # 3  9 7 1 3
#     # 4  6 4 6 4
#     # 5  5
#     # 6  6
#     # 7  9 3 1 7
#     # 8  4 2 6 8
#     # 9  1 9 1 9
#     # 0  0

#     i = 30
#     temp = i
#     for x in xrange(0,i-1):
#         temp = temp * i
#         # print temp
#         print temp%10

# def main():
#     i = 5
#     i = i % 10
#     pass

# if __name__ == '__main__':
#     # main()
#     test()

import sys
from PIL import Image
# import cv2

def splitImage(spx,spy,filepath):


    im = Image.open(filepath)
    # im = Image

    _imageWidth , _imageHeight = im.size

    _eachHeight = _imageHeight / spy
    _eachWidth  = _imageWidth / spx

    _top = 0
    _left = 0
    # order = 0
    # imagesList = Image[]

    for x in xrange(1,spx):
        for y in xrange(1,spy):
            savepath = filepath + str(x) + str(y) + ".png"
            im.crop((_left , _top , _left + _eachWidth , _top +_eachHeight)).save(savepath)
            _top = _top + _eachHeight
            pass
        _top = 0
        _left = _left + _eachWidth


    # print im.


def main():

    args = sys.argv

    if len(args) != 4:
        return

    splitImage(int(args[2]),int(args[3]),args[1])

if __name__ == '__main__':
    main()

其实感觉实现的都一样,自己这里又运行了一下发现仍然没有alpha信息。
然后屌泽说了可能是pil版本问题
自己用的是官网上09年最新的1.1.7版本64位编译
而屌泽说他用的是pycharm内的2.4.0版本
WTF?!官方不是最新的才1.1.7嘛!
后来想想可能是原来的页面没有更新,其实PIL还在继续维护
后来的新版本修复了这个问题

直到现在。。又看了看当时的记录,他有一张截图出现的是pillow。一直不知道有pillow这东西,以为就只有pil,于是网上查了下,是一个替代pil的图像处理库,现在也基本上都用pillow来处理图像了。
从上面的代码也看得出,我用的import Image,而屌泽用的是form PIL import Image
他一直都是在用pillow,问了一下他他说他以为我说的pil就是pillow。。
行了现在也知道为什么他的版本会有2.4.0出来了
看来这问题最终还是pil的问题,而且一直没有更新才出现了pillow这个替代库并解决了这问题

Show Comments