1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
|
__doc__=""" 输入:一个 1024*1024 的 png 图片 输出: AppIconxxxxx.appiconset 目录,包含 iPhone 和 iPad 所需的 App Icons """
import os,sys import imghdr import json import random,shutil
from PIL import Image,ImageFile
class FileSet: def __init__(self,filename,scale): self.filename = filename self.scale = scale @classmethod def fileset(cls,scale,size,prefix): filename = "{}.{}.{}.png".format(size,scale,prefix) file_set = FileSet(filename,scale) return file_set
class ImageSet: def __init__(self,size,idiom,filesets): self.size = size self.idiom = idiom self.filesets = filesets def json_desc(self): descs = [] for fileset in self.filesets: json_dict = {"size":"{}x{}".format(self.size,self.size), "idiom":self.idiom, "filename":fileset.filename, "scale":"{}x".format(fileset.scale)} descs.append(json_dict) return descs
@classmethod def iPhone_set(cls,size,filesets): return ImageSet(size,'iphone',filesets) @classmethod def iPad_set(cls,size,filesets): return ImageSet(size,'ipad',filesets)
@classmethod def market_set(cls,file_prefix=''): size = 1024 return ImageSet(size,idiom='ios-marketing',filesets=[FileSet.fileset(1,size,file_prefix)])
def get_img_sets(iPad=False,iPhone=False,file_prefix=''): img_sets = [] if iPad: for size in [20,29,40,76]: file_sets = [FileSet.fileset(2,size,file_prefix),FileSet.fileset(1,size,file_prefix)] one_set = ImageSet.iPad_set(size,file_sets) img_sets.append(one_set) img_sets.append(ImageSet.iPad_set(83.5,[FileSet.fileset(2,83.5,file_prefix)])) if iPhone: for size in [20,29,40,60]: file_sets = [FileSet.fileset(2,size,file_prefix),FileSet.fileset(3,size,file_prefix)] one_set = ImageSet.iPhone_set(size,file_sets) img_sets.append(one_set) img_sets.append(ImageSet.market_set(file_prefix)) return img_sets
def create_appicon_set(imgobj,t_path='',iPad=False,iPhone=True): rand_str = str(random.randint(20000,2147483648)) t_folder_path = os.path.join(t_path,"AppIcon"+ rand_str +".appiconset") os.makedirs(t_folder_path) img_sets = get_img_sets(iPad=iPad,iPhone=iPhone,file_prefix=rand_str) contents = {"info":{"version":1,"author":"xcode"}} images = [] for single_set in img_sets: for fileset in single_set.filesets: scale_size = (int(single_set.size * fileset.scale), int(single_set.size * fileset.scale)) img_obj = imgobj.resize(scale_size,Image.ANTIALIAS) real_path = os.path.join(t_folder_path,fileset.filename) img_obj.save(real_path) print("保存文件{},\t路径:{}".format(scale_size,real_path)) images += single_set.json_desc() contents["images"] = images with open(os.path.join(t_folder_path,"Contents.json"),"w") as wf: wf.write(json.dumps(contents,indent=4))
if __name__ == '__main__':
argvs = sys.argv[1:] if len(sys.argv) == 3 else None if not argvs: print("Fatal: 要求两个参数,第一个是图片路径,第二个是目标目录") sys.exit(-1)
o_img_path,t_path = argvs if not os.path.isfile(o_img_path) or not imghdr.what(o_img_path) in ['png']: print("Fatal: 图片路径不存在或者非 png 格式图片") sys.exit(-1)
if not os.path.isdir(t_path): print("Fatal: 目标路径不存在或者非目录") sys.exit(-1)
o_img = Image.open(o_img_path) if (1024,1024) != o_img.size : print("Fatal: 图片非 1024x1024 pixel 尺寸") sys.exit(-1) """ 碰到设计师犯糊,将肉眼看不见但确实带有 Alpha 通道的图片提供给我们,直到我们在提交 App Store 的那一刻苹果报错说带有 Alpha 通道,然后我们又要重新走一遍流程🐶。 下面会检查该 1024*1024 的图片是否存在 alpha 通道,若存在,移除之 """ if o_img.getbands()[-1] == 'A': print("Info: 包含 alpha 通道,准备移除...") o_img = o_img.convert("RGB")
create_appicon_set(o_img,t_path=t_path,iPad=True)
|