利用Python为iOS10生成图标和截屏


Posted in Python onSeptember 24, 2016

简介

这两天更新完Xcode8之后发现Xcode对图标的要求又有了变化,之前用的一个小应用“IconKit”还没赶上节奏,已经不能满足Xcode8的要求了。

于是就想起来用Python自己做个脚本来生成图标。

其实这个脚本很早就写了,现在为了适应iOS10,就修改完善下,并且放到了GitHub。

可以看看效果图:

 1.png

代码:

#encoding=utf-8
#by 不灭的小灯灯
#create date 2016/5/22
#update 2016/9/21
#support iOS 10
#site www.winterfeel.com
import os
import sys
from PIL import Image
 
iosSizes = ['20@1x','20@2x','20@3x','29@1x','29@2x','29@3x','40@1x','40@2x','40@3x','60@2x','60@3x','60@3x','76@1x','76@2x','167@1x']
androidSizes = [32,48,72,96,144,192]
androidNames = ['ldpi','mdpi','hdpi','xhdpi','xxhdpi','xxxhdpi']
 
sizesiOS = [(640,960),(640, 1136),(750, 1334),(1242, 2208),(1536, 2048),(2048, 2732)]
foldersiOS = ['iPhone4s','iPhone5','iPhone6','iPhone6plus','iPad','iPadLarge']
 
sizesAndroid = [(480,800),(720,1280),(1080,1920)]
foldersAndroid = ['480x800','720x1280','1080x1920']
 
def processIcon(filename,platform):
  icon = Image.open(filename).convert("RGBA")
  if icon.size[0] != icon.size[1]:
    print 'Icon file must be a rectangle!'
    return
  if platform == 'android':
    #安卓圆角
    mask = Image.open('mask.png')
    r,g,b,a = mask.split()
    icon.putalpha(a)
    if not os.path.isdir('androidIcon'):
      os.mkdir('androidIcon')
    index = 0
    for size in androidSizes:
      im = icon.resize((size,size),Image.BILINEAR)
      im.save('androidIcon/icon-'+ androidNames[index]+'.png')
      index = index + 1
  else:
    if not os.path.isdir('iosIcon'):
      os.mkdir('iosIcon')
    for size in iosSizes:
      originalSize = int(size.split('@')[0])#原始尺寸
      multiply = int(size.split('@')[1][0:1])#倍数
      im = icon.resize((originalSize*multiply,originalSize*multiply),Image.BILINEAR)
      im.save('iosIcon/icon'+size+'.png')
  print 'Congratulations!It\'s all done!'
 
def walk_dir(dir,platform):
  files = os.listdir(dir)
  for name in files:
    if name.split('.')[-1] == 'jpg' or name.split('.')[-1] == 'png':#处理jpg和png
      produceImage(name,platform)
  print 'Congratulations!It\'s all done!'
 
def produceImage(filename,platform):
  print 'Processing:' + filename
  img = Image.open(filename)
  index = 0
  sizes = sizesiOS
  folders = foldersiOS
  if platform == 'android':#默认ios,如果是安卓
    sizes = sizesAndroid
    folders = foldersAndroid
  for size in sizes:
    if not os.path.isdir(folders[index]):
      os.mkdir(folders[index])
    if img.size[0] > img.size[1]:#如果是横屏,交换坐标
      im = img.resize((size[1],size[0]),Image.BILINEAR)
      im.save(folders[index]+'/'+filename)
    else:
      im = img.resize(size,Image.BILINEAR)
      im.save(folders[index]+'/'+filename)
    index = index + 1
 
action = sys.argv[1]#action:icon or screenshot
if action == 'screenshot':  
  platform = sys.argv[2]#platform
  if platform == 'ios':
    walk_dir('./','ios')
  elif platform == 'android':
    walk_dir('./','android')
  else:
    print 'Hey,Platform can only be "ios" or "android" !'
elif action == 'icon':
  filename = sys.argv[2]#image filename
  platform = sys.argv[3]#platform
  if not os.path.exists(filename):
    print 'Hey,File Not Found!'
  else:
    if platform == 'ios':
      processIcon(filename,'ios')
    elif platform == 'android':
      processIcon(filename,'android')
    else:
      print 'Hey,Platform can only be "ios" or "android" !'
else:
  print 'Hey,action can only be "icon" or "screenshot" !'

脚本环境要求

Python 2.7

PIL or Pillow

笔者亲测,也许是笔者太菜,试了各种方法安装PIL总是出错,最后还是用了Pillow,效果一样的。

怎么使用脚本

在Windows的命令行或者Mac的终端,输入:

python tool.py [action] [filename] [platform]
action:icon 或者 screenshot
filename:图标文件名,截屏不需要文件名,自动遍历
platform:ios 或者 android

举一些例子:

生成iOS的图标:python tool.py icon icon.jpg ios

生成安卓的图标:python tool.py icon icon.jpg android

生成iOS的截屏:python tool.py screenshot ios

生成安卓的截屏:python tool.py screenshot android

注意:

生成安卓圆角图标需要一张PNG来裁剪,尺寸512x512,70圆角,GitHub中已经附带。

生成截屏时会自动遍历所有JPG和PNG文件,自动识别横竖屏

结语

如果你觉得有用,欢迎在GitHub中Star一下,也欢迎改进,代码简单易懂加了注释。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
让 python 命令行也可以自动补全
Nov 30 Python
Python编程中对文件和存储器的读写示例
Jan 25 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
selenium2.0中常用的python函数汇总
Aug 05 Python
Python 元组操作总结
Sep 18 Python
基于python plotly交互式图表大全
Dec 07 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
Dec 19 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
python Tornado框架的使用示例
Oct 19 Python
python爬虫selenium模块详解
Mar 30 Python
python正则表达式re.search()的基本使用教程
May 21 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 Python
使用Python多线程爬虫爬取电影天堂资源
Sep 23 #Python
Python 爬虫模拟登陆知乎
Sep 23 #Python
python 自动化将markdown文件转成html文件的方法
Sep 23 #Python
Python增量循环删除MySQL表数据的方法
Sep 23 #Python
教你用Python脚本快速为iOS10生成图标和截屏
Sep 22 #Python
Python 制作糗事百科爬虫实例
Sep 22 #Python
Python 使用SMTP发送邮件的代码小结
Sep 21 #Python
You might like
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
php 文件状态缓存带来的问题
2008/12/14 PHP
PHP输出时间差函数代码
2013/01/28 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
JavaScript的public、private和privileged模式
2009/12/28 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
javascript使用for循环批量注册的事件不能正确获取索引值的解决方法
2014/12/20 Javascript
JavaScript的jQuery库插件的简要开发指南
2015/08/12 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
jQuery滑动效果实现方法分析
2018/09/05 jQuery
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
微信小程序 获取手机号 JavaScript解密示例代码详解
2020/05/14 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
Python使用Matplotlib实现Logos设计代码
2017/12/25 Python
python实现转圈打印矩阵
2019/03/02 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
Python实现分数序列求和
2020/02/25 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Anaconda+spyder+pycharm的pytorch配置详解(GPU)
2020/10/18 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
python字典与json转换的方法总结
2020/12/28 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
宿舍打麻将检讨书
2014/01/24 职场文书
《童年》教学反思
2014/02/18 职场文书
大学理论知识学习自我鉴定
2014/04/28 职场文书
临时租车协议范本
2014/09/23 职场文书
毕业生银行实习自我鉴定
2014/10/14 职场文书
三方协议书
2015/01/27 职场文书
尼克胡哲观后感
2015/06/08 职场文书
节水宣传标语口号
2015/12/26 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
Python竟然能剪辑视频
2021/05/25 Python
详解NodeJS模块化
2021/06/15 NodeJs