• 事前准备

    • 查看swift版本
  • swift脚本编程小知识
    • 终端输入和输出

      • 输出
      • 输入
    • 在swift脚本中调用其他命令
  • 开始编写脚本
    • 读取inputpng
    • 生成AppIconappiconset和Contentsjson
    • 生成不同尺寸的image

自从Xcode8之后就不支持插件了,没法用Xcode一键生成AppIcon,一直没找到好的解决方案,一怒之下决定自己写一个脚本用来生成AppIcon,下面是正文,小弟抛砖引玉,有写的不好的地方有请大佬们见谅:

源码地址

事前准备

查看swift版本

首先你要确定你的Mac上的swift版本:

swift --version

我电脑上的执行结果是这样的:

Apple Swift version 4.0 (swiftlang-900.0.65 clang-900.0.37)
Target: x86_64-apple-macosx10.9

然后就可以用Xcode建一个swift文件来编写swift脚本了,不过单独建一个swift文件,Xcode编辑起来非常不友好,我的方案是建一个在Mac上运行的Command Line Tool工程,这样的话有代码提示,要不然写起来太痛苦,如果大佬们有更好的办法,可以指导一下小弟。

swift脚本编程小知识

终端输入和输出

刚入手脚本我们第一件事前就应该了解在终端如何进行输入和输出,下面是输入和输出的办法:

输出

输入很简单,大家也很熟悉,就是print,下面是代码示例:

print("Hello world!")

然后大家可以执行以下试试(test.swift是你的文件名):

swift test.swift

执行后就能在终端上看到一行字:Hello world!

这样子我们的第一个swift脚本就完成了。

输入

知道了怎么输出我们还得知道怎么输入,输入也非常简单,下面是代码示例:

print("请输入文字:")
if let input = readLine() {print("你输入的文字:\(input)")
}

执行之后显示的结果:

请输入文字:
Hello world!
你输入的文字:Hello world!

这样输入也完成了,我们也算swift脚本编程入门了。

在swift脚本中调用其他命令

我们经常用的命令有很多,比如echo、mkdir、cd等等,我们能不能在swift中直接调用呢,答案是可以的,下面我们用简单的例子来了解一下,大家想深入的话可以去研究一下传送门:

import Foundationfunc execute(path: String, arguments: [String]? = nil) -> Int {let process = Process()process.launchPath = pathif arguments != nil {process.arguments = arguments!}process.launch()process.waitUntilExit()return Int(process.terminationStatus)}let status = execute(path: "/bin/ls")
print("Status = \(status)")

以上的脚本相当于在终端中执行了ls命令,如果大家不知道命令的路径的话,可以用where查找一下,例如:

where ls

这是执行后的结果:

ls: aliased to ls -G
/bin/ls

这里的/bin/ls就是ls命令的路径。

开始编写脚本

读取input.png

首先我们要从将需要转化的图片读取出来,下面是主要代码:

import Foundationlet inputPath = "input.png"
let inoutData = try Data(contentsOf: url)
print("图片大小:\(inoutData.count / 1024) kb")
let dataProvider = CGDataProvider(data: inoutData as CFData)
if let inputImage = CGImage(pngDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) {/// inputImage就是需要转化的图片
}else {print("转换失败,图片必须是png格式")
}

生成AppIcon.appiconset和Contents.json

这里就设计到文件操作了,用FileManager就行了,相信大家已经轻车熟路了,我就贴一些主要代码,大家看完整版去我的github源码看就行了:

import Foundation/// AppIcon的model
struct AppIconImageItem: Codable {let size: Stringlet idiom: Stringlet filename: Stringlet scale: Stringlet role: String?let subtype: String?
}struct AppIconInfo: Codable {let version: Intlet author: String
}struct AppIcon: Codable {var images: [AppIconImageItem]let info: AppIconInfo
}/// 创建contentsJson
///
/// - Parameter appIcon: 传入的appIcon
func createAppIconContentsJson(appIcon: AppIcon) {print("\n开始生成contentsJson\n")let encoder = JSONEncoder()do {encoder.outputFormatting = .prettyPrintedlet appIconData = try encoder.encode(appIcon)if let appIconStr  = String.init(data: appIconData, encoding: .utf8) {let contentJsonPath = "AppIcon.appiconset/Contents.json"let contentJsonUrl = URL(fileURLWithPath: contentJsonPath)try appIconStr.write(to: contentJsonUrl, atomically: true, encoding: .utf8)print("contentsJson生成成功\n")}else {print("contentsJson生成失败")}}catch {print(error.localizedDescription)}
}/// 创建appicon文件
///
/// - Parameter appIcon: appicon
func createFile(appIcon: AppIcon, image: CGImage) {let fileManager = FileManager.defaultlet filePath = "AppIcon.appiconset"do {if fileManager.fileExists(atPath: filePath) {try fileManager.removeItem(atPath: filePath)}try fileManager.createDirectory(atPath: filePath, withIntermediateDirectories: true, attributes: nil)createAppIconContentsJson(appIcon: appIcon)print("~~~~~~~~~~~~~~完成~~~~~~~~~~~~~~")}catch {print("文件目录\(filePath)创建失败")print(error.localizedDescription)}
}

生成不同尺寸的image

生成图片我们用的是Foundation框架里面的Core Graphics框架,下面是主要代码:

import Foundation/// 生成单个image
///
/// - Parameters:
///   - size: 图片的size
///   - scale: 倍数,例如@2x就是2倍
///   - filename: 文件名
func createImage(size: CGSize, scale: CGFloat, image: CGImage, filename: String) {print("开始生成图片: \(filename)")let width  = Int(size.width * scale)let height = Int(size.height * scale)let bitsPerComponent = image.bitsPerComponentlet bytesPerRow = image.bytesPerRowlet colorSpace  = image.colorSpaceif let context = CGContext.init(data: nil,width: width,height: height,bitsPerComponent: bitsPerComponent,bytesPerRow: bytesPerRow,space: colorSpace!,bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue) {context.interpolationQuality = .highcontext.draw(image, in: .init(origin: .zero, size: .init(width: width, height: height)))if let inputImage = context.makeImage() {let outputImagePath = "AppIcon.appiconset/\(filename)"let outputUrl = URL(fileURLWithPath: outputImagePath) as CFURLlet destination = CGImageDestinationCreateWithURL(outputUrl, kUTTypePNG, 1, nil)if let destination = destination {CGImageDestinationAddImage(destination, inputImage, nil)if CGImageDestinationFinalize(destination) {print("图片: \(filename) 生成成功\n")}else {print("图片: \(filename) 生成失败\n")}}}else {print("图片: \(filename) 生成失败\n")}}
}

最后给大家贴以下完成的截图:

上面只是一部分主要代码,完整的代码太多了,大家可以去我的github地址上去下载执行以下试试,如果有什么做的不好的地方,欢迎大家指教~~

swift脚本编程:一键生成AppIcon相关推荐

  1. 微信对话生成脚本,一键生成视频=脚本+教程

    制作微信对话视频,一般做法是: 1. 去网上找对话素材 2. 找一个模拟微信对话的工具 3. 使用对话模拟器生成图片 4. 对图片进行剪辑,生成视频 这样下来几个步骤其实挺麻烦的,并且制作每个视频其实 ...

  2. 【剪辑必备】情感对话号必备-微信对话生成脚本,一键生成视频【安卓永久版脚本】

    微信模拟聊天软件,可以自行更改网名,改头像,聊天内容随意修改,下载即可使用!没有试用教程,用法非常简单 设备需求:安卓系统 教程+工具请到CSDN下载https://download.csdn.net ...

  3. mysql数据库优化器_mysql数据库运维利器-一键生成MySQL数据库优化建议-【安基网】...

    概述MySQLTuner is a script written in Perl that allows you to review a MySQL installation quickly and ...

  4. android批处理脚本,BAT批处理一键生成APK包脚本分享

    BAT批处理一键生成APK包脚本分享 将本bat放到cocos2dx目录下你的工程的project.android下(需修改变量). ASmaker 用来将Resources文件夹下的lua文件批量加 ...

  5. aotu.js 动态运行脚本_素材丨一键生成动态LOGO,3000+个样式随你选!

    分享一套AE扩展预设包,大小是3.79G. 特别要提到的是第17个文件Motion Shapes (运动图形)里面的科幻动态,轻松实现LOGO动态一键生成,用起来特别香! 包含分类: 1/Opener ...

  6. shell一键生成密钥脚本

    shell一键生成密钥脚本 全局声明:以下脚本使用参数路径都来自系统默认,如有需要请自行更改. 初步脚本实例: ssh-keygen -t rsa -N '' <<EOF /root/.s ...

  7. linux一键电影网站脚本,Linux下HTML5播放器一键生成脚本

    原创内容,转载请注明出处: https://www.myzhenai.com.cn/post/2394.html https://www.myzhenai.com/thread-17969-1-1.h ...

  8. PADS layout 脚本一键生成BOM表格-操作步骤

    PADS layout 脚本一键生成BOM表格-操作步骤 打开一个PCB文件,按图片的步骤选项(1.工具,2.基本脚本,3.基本脚本). 选择加载文件. 找到自己下载的脚本文件,选择打开. 找到选择刚 ...

  9. AI写文章软件盘点,一键生成代码、脚本、论文、作文

    AI写文章软件盘点,一键生成代码.脚本.论文.作文!这些现代化的内容创作工具必将给你个性化.高质量和高效率的内容创作带来前所未有的便利和快捷体验. AI写文章软件盘点,一键生成代码.脚本.论文.作文: ...

最新文章

  1. rpm怎样在win安装mysql_centos7.6安装mysql的正确步骤
  2. pip安装库包以及.whl库包、.tar.gz库包具体方式
  3. 第三方登录过程—OAuth2.0协议
  4. Struts1.x在MyEclipse中的环境搭建和配置
  5. 违法收集使用个人信息 抖音、快手、猎聘等105款App被点名
  6. 2019.8.1正则二
  7. go详解bufio包
  8. matlab求方程实根,简单迭代法求方程根的MATLAB程序
  9. ORA-01033错误解决方案
  10. 小程序EXcel文件下载并打开
  11. java获取当前时间的前一个小时
  12. 查看苹果多少位系统(以及设置32或64位)
  13. SDWebImage如何避免复用
  14. ps怎么做出发光抽象效果| 萧蕊冰
  15. 测试人遇到被测 APP 要下架,怎么处理?
  16. 百度率先在元宇宙举办大会,李彦宏:中国迎来AI黄金十年
  17. Spring -- 迈向Spring之路
  18. 鸡兔同笼:笼子里一共有鸡和兔子35只,一共有94条退, 笼子里一共有鸡和兔子共多少只
  19. 欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干
  20. 借助PLC-Recorder,西门子PLC S7-1200实现4ms准确周期采集的方法(带时间戳采集)

热门文章

  1. 多图详解uefi+gpt安装win10系统,再也不用求人了!
  2. nagios利用fetion发送报警
  3. 大数据学习之小白快速了解flume
  4. Win7的77个小知识不容错过
  5. 微信小程序携带token请求
  6. /usr/bin/yum: /usr/bin/python3.6.8: bad interpreter: No such file or directo
  7. 基于单片机的居家安全报警系统
  8. 程序员月薪一万二在北京的真实生活!
  9. 7-55 Keven裂了
  10. ui设计自学对于零基础的人来说难不难