-
Notifications
You must be signed in to change notification settings - Fork 0
/
encode-heic.swift
executable file
·49 lines (39 loc) · 1.81 KB
/
encode-heic.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
#!/usr/bin/env swift
//
// encode-heic.swift
//
// Originally authored by Sinoru, 2018/4/28
// https://gist.github.com/sinoru/36b26cdbfcbc0899ff309f6cad6c1831
//
// Minor formatting and text cleanup by aikinai, 2018/12/18
//
import Foundation
import ImageIO
import AVFoundation
// HEIC quality setting of 0.75 seems to be about 50% of JPEG file size at 80%
// with the same perceptual quality
let HEICQuality = 0.75
print("\n\u{001B}[01;35mEncode all input files as HEIC at \u{001B}[0;33m\(HEICQuality) \u{001B}[01;35mquality\u{001B}[0;0m")
for argument in CommandLine.arguments.dropFirst() {
print("Encode \u{001B}[0;33m\(argument)\u{001B}[0;0m")
let sourceFileURL = URL(fileURLWithPath: argument)
guard let imageSource = CGImageSourceCreateWithURL(sourceFileURL as CFURL, nil) else {
print("\u{001B}[0;31mError\u{001B}[0;0m: Could not load \(sourceFileURL)")
continue
}
let imageProperties = CGImageSourceCopyProperties(imageSource, nil)
let imageCount = CGImageSourceGetCount(imageSource)
let destinationFileURL = sourceFileURL.deletingPathExtension().appendingPathExtension("heic")
guard let imageDestination = CGImageDestinationCreateWithURL(destinationFileURL as CFURL, AVFileType.heic as CFString, imageCount, nil) else {
print("\u{001B}[0;31mError\u{001B}[0;0m: Could not write \(destinationFileURL)")
continue
}
CGImageDestinationSetProperties(imageDestination, imageProperties)
for index in 0..<imageCount {
CGImageDestinationAddImageFromSource(imageDestination, imageSource, index, [kCGImageDestinationLossyCompressionQuality: HEICQuality] as CFDictionary)
}
guard CGImageDestinationFinalize(imageDestination) else {
print("\u{001B}[0;31mError\u{001B}[0;0m: Could not finalize \(destinationFileURL)")
continue
}
}