图片压缩脚本
通过 tinypng 提供的 api 批量压缩工程中 xcassets 的图片。对于已压缩的图片,在图片的 exif 信息中添加 Comment 字段,防止重复压缩操作。
def isImageCompressed(path)
require 'rmagick'
image = Magick::Image.read(path).first
result = image["Comment"]
return false if result.nil?
result.include?("Compressed by tinypng")
end
def recordImageCompressed(path)
require 'rmagick'
image = Magick::Image.read(path).first
commnet = image["Comment"].nil? ? "" : "#{image["Comment"]}\n"
image["Comment"] = commnet + "Compressed by tinypng"
image.write(path)
end
desc "压缩图片"
lane :compress_images do
require "tinify"
Dir.chdir ".."
require "json"
require "tinify"
keys = ["key1", "key2", "key3"]
Tinify.key = keys[0]
puts "图片检索中..."
exclude_dirs = ["Pods", "*.bundle"].map { |d| "./dealer/**/#{d}/**/*.{png,jpg}" }
images = Dir.glob("./dealer/**/*.{png,jpg}")
images -= Dir.glob(exclude_dirs)
images = images.select { |image| !isImageCompressed(image) }
puts "待压缩图片数量: #{images.count}"
images.each_with_index { |f, i|
puts "正在处理图片: #{f}"
begin
Tinify.from_file(f).to_file(f)
recordImageCompressed(f)
key_index = (i + 1) / 500
if key_index < keys.count
Tinify.key = keys[key_index]
else
puts "key 用完了, 快给我新 key (●゚ω゚●)"
break
end
rescue => exception
puts "😭 #{f} 压缩失败了,失败原因: #{exception}"
break
end
}
end