-
Notifications
You must be signed in to change notification settings - Fork 18
/
generate-icons.swift
64 lines (47 loc) · 2.13 KB
/
generate-icons.swift
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
import Cocoa
guard CommandLine.arguments.count == 3 else {
print("Usage: swift \(CommandLine.arguments[0]) <path/to/largeIcon.png> <path/to/Assets.xcassets/AppIcon.appiconset>")
exit(1)
}
let inputImagePath = CommandLine.arguments[1]
let inputIconSetPath = CommandLine.arguments[2]
let iconSetJSONURL = URL(fileURLWithPath: inputIconSetPath + "/Contents.json")
let imageTemplate = NSImage(byReferencingFile: inputImagePath)!
let iconSetData = try! Data(contentsOf: iconSetJSONURL)
var iconSet = (try! JSONSerialization.jsonObject(with: iconSetData, options: .mutableContainers)) as! [String: Any]
func resize(image: NSImage, w: Float, h: Float) -> Data {
let destSize = NSMakeSize(CGFloat(w), CGFloat(h))
let newImage = NSImage(size: destSize)
newImage.lockFocus()
image.draw(
in: NSMakeRect(0, 0, destSize.width, destSize.height),
from: NSMakeRect(0, 0, image.size.width, image.size.height),
operation: .sourceOver,
fraction: 1
)
newImage.unlockFocus()
newImage.size = destSize
print(destSize)
return NSBitmapImageRep(data: newImage.tiffRepresentation!)!.representation(using: .png, properties: [:])!
}
var images = (iconSet["images"] as! [[String: String]])
images.enumerated().forEach { data in
let scaleString = data.1["scale"]!
let nameString = data.1["idiom"]!
let sizeString = data.1["size"]!
let scale = Float(scaleString.replacingOccurrences(of: "x", with: ""))!
let size = Float(sizeString.components(separatedBy: "x").first!)!
// The Retina display affects scaling. Account for this.
let screenFactor = Float(NSScreen.main!.backingScaleFactor)
let side = size * scale / screenFactor
print("Scaling \(scale)*\(size) = \(size * scale)")
let resizedImage = resize(image: imageTemplate, w: side, h: side)
let filename = "\(nameString)_\(sizeString)@\(scaleString).png"
let path = URL(fileURLWithPath: inputIconSetPath + "/" + filename)
try! resizedImage.write(to: path)
images[data.0]["filename"] = filename
}
iconSet["images"] = images
let newIconSetData = try! JSONSerialization.data(withJSONObject: iconSet, options: .prettyPrinted)
try! newIconSetData.write(to: iconSetJSONURL)
print("Done")