Optimize images with ImageOptim
This commit is contained in:
parent
58f7642ca5
commit
4c2c4b7dd3
@ -18,6 +18,10 @@ private struct ImageJob {
|
||||
|
||||
final class ImageGenerator {
|
||||
|
||||
private let imageOptimSupportedFileExtensions: Set<String> = ["jpg", "png", "svg"]
|
||||
|
||||
private let imageOptimizationBatchSize = 50
|
||||
|
||||
/**
|
||||
The path to the input folder.
|
||||
*/
|
||||
@ -66,6 +70,11 @@ final class ImageGenerator {
|
||||
*/
|
||||
private var generatedImages: Set<String> = []
|
||||
|
||||
/**
|
||||
The images optimized by ImageOptim
|
||||
*/
|
||||
private var optimizedImages: Set<String> = []
|
||||
|
||||
/**
|
||||
A cache to get the size of source images, so that files don't have to be loaded multiple times.
|
||||
|
||||
@ -182,8 +191,9 @@ final class ImageGenerator {
|
||||
create(images: jobs, from: source)
|
||||
count += 1
|
||||
}
|
||||
print(String(format: " \r", count, imageJobs.count), terminator: "")
|
||||
print(" \r", terminator: "")
|
||||
createMultiImages()
|
||||
optimizeImages()
|
||||
printMissingImages()
|
||||
printImageWarnings()
|
||||
printGeneratedImages()
|
||||
@ -360,7 +370,7 @@ final class ImageGenerator {
|
||||
createMultiImages(from: baseImage, path: path)
|
||||
count += 1
|
||||
}
|
||||
print(String(format: " \r", count, sort.count), terminator: "")
|
||||
print(" \r", terminator: "")
|
||||
}
|
||||
|
||||
private func createMultiImages(from source: String, path: String) {
|
||||
@ -414,4 +424,33 @@ final class ImageGenerator {
|
||||
addWarning("Failed to compress image", destination: destination, path: destination)
|
||||
}
|
||||
}
|
||||
|
||||
private func optimizeImages() {
|
||||
let all = generatedImages
|
||||
.filter { imageOptimSupportedFileExtensions.contains($0.lastComponentAfter(".")) }
|
||||
.map { output.appendingPathComponent($0).path }
|
||||
for i in stride(from: 0, to: all.count, by: imageOptimizationBatchSize) {
|
||||
let endIndex = min(i+imageOptimizationBatchSize, all.count)
|
||||
let batch = all[i..<endIndex]
|
||||
print(String(format: "Optimizing images: %4d / %d\r", endIndex, all.count), terminator: "")
|
||||
fflush(stdout)
|
||||
if optimizeImageBatch(batch) {
|
||||
optimizedImages.formUnion(batch)
|
||||
}
|
||||
}
|
||||
print(" \r", terminator: "")
|
||||
fflush(stdout)
|
||||
print("\(optimizedImages.count) images optimized")
|
||||
}
|
||||
|
||||
private func optimizeImageBatch(_ batch: ArraySlice<String>) -> Bool {
|
||||
let command = "imageoptim " + batch.joined(separator: " ")
|
||||
do {
|
||||
_ = try FileSystem.safeShell(command)
|
||||
return true
|
||||
} catch {
|
||||
addWarning("Failed to optimize images", destination: "", path: "")
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user